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