この記事の内容
Railsで新規プロジェクトを立ち上げることになりました。
Docker周りも一から設定するのは初めてだったため、公式のRailsの設定ガイドを参考にしつつ、バージョン等を最新版(2021年8月時点)にアップデートして作成しました。
今後自分でカスタマイズしていくことが予想されたので、下記ガイドのコマンドも一つ一つ丁寧に読んで理解してみることにしました。
以下は、その時のノートです。
なおDockerfileだけではなくRailsの環境構築全体を解説した記事には以下の素晴らしい記事があります。
また、途中で出てくるDockerfileのコマンドに関しては、全てこちらの公式ガイドの日本語訳の方が詳しいです。
この記事は、あくまでもRailsを立ち上げるための最低限の機能を細かく読み解きながら記載しているものになります。
【追記:この記事の続きの環境構築を書きました!】
Define the project (プロジェクトの定義)
序盤
下記のコードは、公式のDefine the projectの最初の部分を最新版にアレンジしたものです。(以下、同じ)
# syntax=docker/dockerfile:1
FROM ruby:3.0.2
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
1行ずつ読み解いていきます。
FROM ruby:3.0.2
-
FROM... 使用するイメージを定義します。 - **
イメージ名:タグ**の順に記載します。 - どんなタグが存在するかは、dockerhubのrubyのページで調べます。
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
-
RUN... 実行するコマンドを指定します。 -
apt-get update -qq... ライブラリをアップデートします。-qqはquietモードで実行。エラー以外を表示しないオプションです。 -
apt-get install -y nodejs postgresql-client... 全て承諾(-yオプション)で必要なライブラリを入れます
postgresql-clientを入れると、psqlコマンドが使えるようになるんですね。へー。。。
WORKDIR /myapp # アプリ名
-
WORKDIR... 作業ディレクトリの指定。ここで指定したディレクトリが、その後のDockerfile内でのRUN,COPYなどのあらゆる命令の起点となります。
COPY Gemfile /nanairo/Gemfile
COPY Gemfile.lock /nanairo/Gemfile.lock
RUN bundle install
ローカルのGemfile及びGemfile.lockをDockerコンテナ内にコピーして、bundle installします。
中盤
# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
COPY entrypoint.sh /usr/bin/
-
entrypoint.shをコンテナ内の/usr/bin/にコピーします。 -
entrypoint.shにはコンテナ立ち上げ時に実行するスクリプトを書きます。何を書けば良いかは、先に取り上げた公式のRailsの設定ガイドの下方に書いてあります。
RUN chmod +x /usr/bin/entrypoint.sh
- ファイル所有者に
entrypoint.shの実行権限を付与します。
ENTRYPOINT ["entrypoint.sh"]
-
ENTRYPOINT... 最初に実行するコマンドを指します。文法やベストな使い方は公式の以下のガイド(日本語訳)に詳しかったです。 - ENTRYPOINT
EXPOSE 3000
-
EXPOSE... コンテナがリッスン(待機)するポート番号を指定します。
終盤
# Configure the main process to run when running the image
CMD ["rails", "server", "-b", "0.0.0.0"]
-
CMD... ソフトウェアを実行するコマンドです。["実行ファイル","パラメータ1","パラメータ2", ...]の形式で書かれています。 - こちらも詳しい書き方やベストな使い方がガイドに紹介されていました
で、途中に出てきた entrypoint.sh って何よ?
コンテナ立ち上げ時に実行するコマンドをここでは entrypoint.sh というファイルに記していましたね。こちらのファイルを手動で作成したのち、以下のように記します。
# !/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"
-
#!/bin/bash... bashを利用したシェルスクリプトであることを示しているそうです。へー。(この記事の中盤に書いてありました) -
set -e... エラーが出たらスクリプトを中断します。 -
rm -f /myapp/tmp/pids/server.pid... pidファイルが既に存在するためサーバーが立ち上がらないエラーを回避するため、server.pidファイルが既にあった場合、それを削除します。 -
exec "$@"... DockerfileのCMDの部分に書いてあるコマンドを実行する記述。"$@"自体はシェルスクリプトらしいのだけど謎が多くて分からないので今回は呪文として覚える。
終了!
以上でした!シンプルなサンプルだったからかもしれませんが、意外と簡単でした^^;
実際に使うには、他docker-compose.ymlの作成など色々必要ですが、そちらは作成し次第随時追記していきます。
【シリーズの他の記事】