Dockerとコンテナ技術 その10:Dockerfileによるカスタムイメージの作成②

今回は前回の記事に続いて、Dockerfileについてまとめていきたいと思います。
前回の記事はこちら。

キョウタコの技術日記

Dockerコンテナはレジストリから用途に合ったイメージを取得して作成する方法の他に、自分でカスタムしたイメージから作成…

Dockerfileの記述方法

Dockerfileの基本構造

Dockerfileはカスタムイメージを定義するファイルですが、基本的に以下のような構造になっています。

大文字のコマンド [パラメータ...]

例えば、前回の記事の例で実際に記述したFROM ubuntu:20.04は、FROMという大文字のコマンドにubuntu:20.04というパラメータを指定しています。
このようなコマンドを記述していくことでカスタムイメージを作成していくのが基本となっています。

FROMでベースイメージを指定

まず最初に、前回の記事でも出てきたベースイメージを指定するFROMコマンドから紹介していきます。
FROMコマンドは基本的にDockerfileの一番最初に記述されます。

FROM [ベースイメージ]
例
FROM ubuntu:20.04

RUNで任意のコマンドを実行

RUNコマンドは任意のコマンドを実行します。
FROMコマンドによるベースイメージのダウンロード後にライブラリのインストールを実施する場合などに利用されます。

RUN [任意のコマンド]
例
RUN npm ci
RUN apt update
etc...

COPYでファイルをイメージに配置する

COPYコマンドはファイルをイメージに配置するためのコマンドです。

COPY [配置元] [配置先]
例
COPY ./hoge.txt /app/
COPY ./hoge/ /app/

上記の例のように、配置元はファイル単体でもフォルダでもどちらでも大丈夫です。
また、イメージに配置したファイルはdocker image buildを実施した時点の内容がイメージに保持されるため、その後にホストマシン上のファイルを編集してもイメージ上のファイルに影響はありません。

CMDでデフォルトコマンドを設定

CMDコマンドはコンテナ実行時のデフォルトコマンドを設定するためのコマンドです。
そのため、Dockerfile内で1回だけ実行可能で、複数指定されていた場合は最後のもののみが実行されるようになっています。

CMD ["実行コマンド", "パラメータ1", "パラメータ2", ... ]
例
CMD ["ls", "-la"]
CMD ["echo", "Hello World!"]

ENVで環境変数を設定

ENVコマンドはイメージの環境変数を設定することができます。

ENV KEY1=value1 KEY2=value2...
例
ENV HELLO="Hello World"
ENV DEV_HOST=localhost TEST_HOST=https://test/

環境変数はコンテナ起動後も有効であり、実行中に利用する設定値などを環境変数で定義する際などに使用します。

ARGでイメージビルド時に変数を利用する

ARGコマンドはイメージビルド時に利用する変数を宣言することができます。
宣言した変数は、Dockerfile内で値の代入もできますし、宣言だけしておいてビルド時に値を代入することもできます。

# 宣言と代入をDockerfileで行う場合
ARG arg1=value1 arg2=value2...
# 宣言のみ行う場合
ARG arg3

docker image buildコマンドで変数に値を代入するときは以下のようなオプションをつけます。
例として、宣言のみ行ったarg3という変数に対してvalue3を代入しています。

docker image build --build-arg arg3=value3 [ビルドコンテキストのパス]

ARGコマンドで定義された変数は環境変数と違い、ビルド時のみ有効な一時的なものになります。

WORKDIRでワーキングディレクトリを変更する

WORKDIRコマンドはイメージビルド中の作業ディレクトリの変更を行うことができます。
ディレクトリが存在しない場合は新たにディレクトリを作成してから作業ディレクトリの変更を行います。
RUNコマンドでlstouchコマンドなどを行うときに、WORKDIRコマンドで指定した作業ディレクトリ上でコマンドが実行されることになります。
また、イメージビルド時に最後に指定されていた作業ディレクトリが、コンテナ起動時のデフォルトのディレクトリになります。
何も指定していない場合、作業ディレクトリはルートディレクトリ(’/’)になります。

WORKDIR ディレクトリパス
例
WORKDIR /app/

コメントアウト

Dockerfileの記述をコメントアウトする場合は、先頭に#を付けます。

例
# RUN npm i react

まとめ

Dockerfileの具体的な内容についてまとめました。
こちらに記載されている以外にも多くのオプションが存在するので、必要であれば都度調べて適した設定を行うようにしましょう。
ここまで読んでいただきありがとうございました。
それでは、また。