Dockerファイルの設定について(rails編)

Docker

今まで動けば良いやで済ませてきたDockerファイルでしたが、エラーを起こしてDockerが立ち上がらなったりした時に、根本的な原因が掴めずに苦労していました。そこで、論理立ててちゃんとエラー対応できるようになりたいなということで、まずはしっかりDockerfileについて理解しようと思い、調べたことを記事にしました。

本記事では、railsのDockerファイルに記載されている内容を掘り下げてみます。

railsのDockerfileの調査

今回使用するDockerfileはこちらになります。

FROM ruby:3.0

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

ENV APP_PATH /myapp

RUN mkdir $APP_PATH
WORKDIR $APP_PATH

COPY Gemfile $APP_PATH/Gemfile
COPY Gemfile.lock $APP_PATH/Gemfile.lock
RUN bundle install

COPY . $APP_PATH

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

まず、基本コマンドである、RUNとかCOPYが何をしているかを調査します。

Dockerfileの基本コマンドについて

・FROM

Dockerイメージの元となるベースイメージを指定するコマンド。

dockerfileで行われる処理は、docker hubなどにあるイメージを持ってきて、それに追加処理を加えていく流れ(レイヤーを追加していくイメージ)になるため、まずはベースとなるイメージが必要。

・COPY

ホストPCのファイルをDockerコンテナ内にコピーする。ローカルで作業していたアプリのディレクトリをCOPY元として指定することで、ホストからdockerイメージにファイルを取り込むことができ、dockerコンテナでアプリを動かすことができるようになる。

・RUN

Linuxコマンドを実行する処理。上記でcopyしたファイルに対して追加で処理を行うことができたり、Dockerコンテナの内部に行いたい処理を書くことで、それが実施された状態のイメージが作成される。

(例)RUN touch testとすると、コンテナ作成時にtestというファイルが作成される。

・ENV

Dockerコンテナ内で使用される環境変数を設定している。

・WORKDIR

Dockerコンテナ内内での作業ディレクトリ(カレントディレクトリ)を指定するもの。

・ENTRYPOINT

Dockerコンテナが起動されたときに実行されるデフォルトのコマンドまたはスクリプトを指定する。

・EXPORSE

Dockerコンテナが公開するポート番号を指定する。

・CMD

コンテナのデフォルトのコマンドを指定するもの

Dockerファイルのコードの解析

FROM ruby:3.0

ベースのイメージを指定しています。今回はrailsを使用しており、バージョンは3.0としています。

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

これは2つのコマンドを実行しているため、分解すると、

RUN apt-get update -qq

RUNはdockerイメージのビルド時に実行されるコマンドなので、ビルド時に、apt-get update -qqをしています。

apt-get updateは、Dockerイメージ内のパッケージリストを最新の状態に更新するものらしいです。おまじない的なものですね。

RUN apt-get install -y build-essential libpq-dev nodejs

これは、build-essentialとlibpq-devとnodejsをdockerコンテナ内にインストールしています。

•build-essential:gccとかg++とかmakeとか開発に必要なものが色々入る

•libpq-dev:postgreSQLを使用する際に必要なパッケージ

•nodejs: javascriptをブラウザ上で動作できるようにする実行環境

ENV APP_PATH /myapp

Dockerコンテナ内の環境変数を指定しています。/myappは以降$APP_PATHとして表示できます。

RUN mkdir $APP_PATH

dockerコンテナ内に、myappディレクトリを作成します。

WORKDIR $APP_PATH

/myappを作業ディレクトリ(カレントディレクトリ)として、以降のコンテナ内での作業をここでやっていきます。

COPY Gemfile $APP_PATH/Gemfile
COPY Gemfile.lock $APP_PATH/Gemfile.lock
RUN bundle install

railsのパッケージ管理ツールであるGemfileとGemfile.lockをdockerコンテナ内に移行し、コンテナ内でbundle install することで、必要なファイルを入れています。

上記コマンドは、ビルド時におこなっているので、Gemfileを更新したら、docker buildして、イメージを作り直す必要があります。

COPY . $APP_PATH

dockerfileが存在するディレクトリの中にあるすべてのファイル・ディレクトリが/myappへ移行されます。

COPY entrypoint.sh /usr/bin/

/usr/bin/ディレクトリは一般的にシステムコマンドやユーティリティスクリプトが配置されるディレクトリ。entorypoint.shは最初の一度だけ実行するものになります。

RUN chmod +x /usr/bin/entrypoint.sh

chmod + xはファイルに実行権限を追加するためのコマンド。

ENTRYPOINT ["entrypoint.sh"]

ENTRYPOINTを指定することで、コンテナ起動時に実行されるようになる。

EXPOSE 3000

コンテナ内でアプリケーションが使用するポート番号。3000番でrailsは立ち上げられる。

CMD ["rails", "server", "-b", "0.0.0.0"]

コンテナが起動されたときにデフォルトで実行されるコマンドを指定する。

rails server -b 0.0.0.0というコマンドを実行しており、rails serverはrailsアプリケーションのサーバーを起動し、-b 0.0.0.0オプションを使用することでホストのすべてのネットワークインターフェースにバインドする。

まとめ

以上、railsのDockerfileを使用して、内容の読み解きをおこないました。

まだ、理解できていないところもありますが、以前と比べて、中身のコードが何をしているかがだいぶわかるようになりました。

エラー発生時にスムーズに対応できるようよう、引き続きDockerfileを使用してより理解を深めていきたいです。

コメント

タイトルとURLをコピーしました