前書き
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/