ume

RubyとRailsのdockerfileの書き方

前書き

railsのコンテナを作成しようとdockerfileを作成する機会がありました.
ただ下記のような疑問がありました

  • dockerfileにどんなコマンドをどんな順番で記載すべきなの?

上記のdockerfileはどうやって疑問を解決するために記事に残します

dockerfile全体像

dockerfile

①ベースイメージ設定. 
②パッケージをインストール
③作業用ディレクトリ作成/移動
④gemfileとgemfile.lockコピー
⑤bundle install 
⑥アプリケーションコピー

dockerfileの書式

書式
命令 引数

命令は文字と小文字を区別しません。ただし、引数と区別をつけやすくするため、慣例として大文字を使います。

命令一覧
命令 説明
FROM ベースとなるDockerイメージを指定します。
MAINTAINER イメージの作成者やメンテナを指定します。
RUN コマンドを実行し、新しいイメージレイヤーを作成します。
CMD コンテナが起動された際に実行されるデフォルトのコマンドを指定します。
LABEL イメージにメタデータを追加します。
EXPOSE コンテナが使用するポートを外部に公開します。
ENV 環境変数を設定します。
ADD ファイルやディレクトリをイメージに追加します。
COPY ローカルファイルやディレクトリをイメージにコピーします。
ENTRYPOINT コンテナが実行される際に実行されるコマンドを指定します。
VOLUME マウントポイントとして使用されるディレクトリを指定します。

dockerfileの書き方

ベースイメージ設定

⇨FROMコマンドを使う dockerfile

FROM <イメージ名>[:<タグ>] [AS <任意の名前>]

まずはFROMを最初に記載する.
[AS <任意の名前>]このオプションを付けることでベストプラクティスを満たしながらベースイメージを作成することができます.
[AS <任意の名前>]これは要はイメージに含まれる不要なライブラリーを排除するために使われるオプションです。 このオプションを使用すると後で以下を実行する必要があるみたいです

COPY --from=<名前>

↑僕の場合<名前>=build

今回Rubyの3.2.2と指定する

FROM ruby:3.2.2 AS build

パッケージをインストール

⇨RUNコマンドを使う

RUN apt-get update -qq && apt-get install -y 

作業用ディレクトリ作成/移動

⇨WORKDIRコマンドを使う

WORKDIR /app

上記appで作業するよってこと。もしappディレクトリがない場合は作成もしてくれる。

gemfileとgemfile.lockコピー

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

ホストマシンのGemfileとGemfile.lockファイルをapp/Gemfileにコピーする

bundle install

RUN bundle install

gemfileに記載されたものをあれこれインストール

アプリケーションコピー

COPY . /app

完成図

FROM ruby:3.2.2 AS build
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app

豆知識

dockerfileでイメージを作成する際は.dockerignoreファイルも作成する.

.dockerignoreとは.

⇨イメージに不要なファイルやディレクトリを指定することでビルド時間を短縮する。要はDockerイメージのビルドパフォーマンスを向上させる

.dockerignoreに含めるディレクトリやファイル例
/.bundle/
/.dockerignore
/.git/
/.git*
/.ruby-version
/README.md
/config/master.key
/log/
/node_modules/
/storage/
/tmp/
/vendor/