top_logo

docker-composeを用いてRails APIモードの環境構築①

2022年 03月 26日

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 を記述

次に Gemfile に以下のように記述します。Rails のバージョンはお任せします。 この状態でbundle install するとコンテナに Rails がインストールされます。

backend/api/Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 6.1', '>= 6.1.5'

Dockerfile を記述

以下のようにDockerfileを記述します。


API モードなので、yarn node は入れていません。

backend/api/Dockerfile
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 を記述

entrypoint.sh は先ほど言ったようにdocker-compose up -dのようなコンテナを起動させるコマンドを実行した時のみ、実行されるスクリプトを記述していきます。

backend/api/entrypoint.sh
#!/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

set -e は「エラーが発生するとスクリプトを終了する」オプション


(参考 https://unix.stackexchange.com/questions/466999/what-does-exec-do


rm -f /api/tmp/pids/server.pid

rm -f /api/tmp/pids/server.pid ではすでに存在する Rails の pid を削除


exec ”$@”

exec "$@"では、Dockerfile のCMDで記述されたコマンドを実行しています。


DockerfileCMD に指定したコマンドが DockerfileENTRYPOINTに指定したコマンドの引数になるというイメージです!


つまり以下のようなコマンドを実行してサーバーを立ち上げていることになります。


$ exec "$@" bundle exec puma -C config/puma.rb

長くなってしまうので一旦ここまでにします。


わかりにくい点、間違っている点などあれば以下にご連絡いただければと思います。


連絡先

何か連絡をしたい際は以下 SNS、メールでお願いいたします。

Twitter:  https://twitter.com/naka_ryo_z

Github:  https://github.com/ryotaro-tenya0727

メール:   ryotaro123110@gmail.com

見出しへのリンク

© 2024, written by Nakayama

Powered by Gatsby