docker-composeを用いてRails APIモードの環境構築①
Rails API モードの環境構築を docker-compose を用いて行う方法を解説していきます。
以下のようなフォルダ構成にします。
作成するファイルの役割は後述します!
backend(ディレクトリ)
├ api(ディレクトリ)
│ └ Dockerfile
│ └ Gemfile
│ └ entrypoint.sh
└ docker-compose.yml
任意のディレクトリで上の構成になるようにディレクトリとファイルを作っていきます。
$ mkdir backend
$ cd backend
$ mkdir api
$ cd api
$ touch Dockerfile Gemfile entrypoint.sh
$ cd ..
$ touch docker-compose.yml
次に Gemfile に以下のように記述します。Rails のバージョンはお任せします。
この状態でbundle install
するとコンテナに Rails がインストールされます。
source 'https://rubygems.org'
gem 'rails', '~> 6.1', '>= 6.1.5'
以下のようにDockerfile
を記述します。
API モードなので、yarn
node
は入れていません。
FROM ruby:2.7.4
RUN apt-get update
RUN apt-get install -y build-essential
WORKDIR /api
COPY Gemfile /api/
RUN bundle install
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD bundle exec puma -C config/puma.rb
ポイントを解説していきます。
ENTRYPOINT
にはコンテナ起動時に実行されるコマンドを記述しています。
今回であれば["entrypoint.sh"]
と書くことによってentrypoint.sh
に書かれたシェルスクリプトを実行しています。
そしてCMD
に指定したコマンドがentrypoint.sh
に記述したシェルスクリプトの引数として実行されます。
entrypoint.sh
は先ほど言ったようにdocker-compose up -d
のようなコンテナを起動させるコマンドを実行した時のみ、実行されるスクリプトを記述していきます。
#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /api/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
それぞれ以下のような役割です。
set -e
は「エラーが発生するとスクリプトを終了する」オプション
(参考 https://unix.stackexchange.com/questions/466999/what-does-exec-do)
rm -f /api/tmp/pids/server.pid
ではすでに存在する Rails の pid を削除
exec "$@"
では、Dockerfile のCMD
で記述されたコマンドを実行しています。
Dockerfile
のCMD
に指定したコマンドが Dockerfile
のENTRYPOINT
に指定したコマンドの引数になるというイメージです!
つまり以下のようなコマンドを実行してサーバーを立ち上げていることになります。
$ exec "$@" bundle exec puma -C config/puma.rb
長くなってしまうので一旦ここまでにします。
わかりにくい点、間違っている点などあれば以下にご連絡いただければと思います。
何か連絡をしたい際は以下 SNS、メールでお願いいたします。
Twitter: https://twitter.com/naka_ryo_z