dockerとdocker-composeでwebアプリをdocker化
今回構築したいDocker環境
- docker-compose upでrailsプロセスとdbが起動し、http://localhost:3000 でアクセスできるようにすること
- nodejs,yarnはマルチステージビルドでインストールすること(apt-getは使用しない)
※マルチステージビルド- 1つのDockerfileに複数のイメージを作る
- 複数のFROMが存在する
手順
-
今回は
rails new
はしてある -
必要なファイルを準備する
touch [Dockerfile docker-compose.yml]
- Dockerfileに以下を記述
# FROMが2つあり、nodeとrubyの2つのイメージ FROM node:14.17.6 as node FROM ruby:3.0.2 # railsのセットアップ WORKDIR /rails-docker # 複数コピーする場合はtargetのディレクトリの最後にスラッシュ(/)を追加しないとエラーになるらしい COPY Gemfile Gemfile.lock /rails-docker/ RUN bundle install # nodeのイメージからyarnを取得、hostのパッケージを持ってくる COPY --from=node /opt/yarn-* /opt/yarn COPY --from=node /usr/local/bin/node /usr/local/bin/ COPY --from=node /usr/local/lib/node_modules/ /usr/local/lib/node_modules/ # npmが入っているファイルに扱いやすい名前でシンボリックリンクを作成 # -sでシンボリックリンク、デフォはハードリンク # -fでリンクファイルと同じ名前のファイルがあっても強制的に上書きする、ビルド時にファイル重複でエラーを吐かせないため RUN ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \ && ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npx \ && ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn \ && ln -fs /opt/yarn/bin/yarnpkg /usr/local/bin/yarnpkg # docker-compose up時にrailsサーバーを立ち上げる CMD [ "rails", "s", "-b", "0.0.0.0" ]
- docker-compose.ymlに以下を記述
docker-compose.ymlversion: '3.9' volumes: # dbのデータを入れておくためのdocker volume db-data: services: web: build: . ports: - "3000:3000" volumes: - '.:/rails-docker' environment: - 'DATABASE_PASSWORD=postgres' tty: true stdin_open: true depends_on: - db db: # DBをpostgresqlに image: postgres volumes: - 'db-data:/var/lib/postgresql/data'
-
/config/database.ymlの変更
default: &defaultに以下を追記
host, user, port, paswordを追加
database.yml
host: db
user: postgres
port: 5432
password: <%= ENV.fetch("DATABASE_PASSWORD") %>
-
docker-compose up
して、http://localhost:3000/ にアクセスしてrailsの画面が表示されていれば成功
自分はvolumes先のパスの指定をWORKDIRで指定したものと違うものによくなっているのでチェックを忘れないようにしたい。コンテナが立ち上がったあとコンテナに入ってls
でちゃんとビルドコンテキストがマウントできているか確認するのが良さそう。