なんとなくでも、Dockerfileは作れてしまいますが、オプションを正しく理解したいと思いマニュアルを参考に、使える命令を整理してみます。
公式マニュアル
https://docs.docker.com/reference/builder/
基本的な形式
Dockerfileは、主に下記のような形式で記述します。
# コメント行 INSTRUCTION arguments
- INSTRUCTION → 命令
- arguments → 引数
命令
以下でDockerfileで使える命令について説明していきます。
FROM
FROMはコンテナのベースイメージを指定します。
Dockerfileの中で、コメントを除いた最初の命令として記述する必要があります。
imageにはDockerHubで公開されているイメージを指定します。
ローカルで作成したものも指定もできます。
- パターン1
FROM <image>
- パターン2 (tagオプション指定)
FROM <image>:<tag>
- パターン3 (digestオプション指定)
FROM <image>@<digest>
MAINTAINER
コンテナの管理者を明示するためのものです。
主に担当者の名前やメールアドレスを書きます。
MAINTAINER <name>
RUN
コンテナを作成する際にコマンドを実行し、コンテナイメージにコミットします。
方法は2種類あります。
- パターン1
RUN <command>
この方法では、指定したコマンドは/bin/sh -cの引数として実行されます。
- パターン2
RUN ["executable", "param1", "param2"]
こちらは、そのままexecutableを実行します。
CMD
コンテナ起動時にデフォルトで実行するコマンドを指定します。
3種類の書き方があります。
- パターン1
# shell form CMD command param1 param2
/bin/sh -cの引数として実行されます。
- パターン2
# exec form CMD ["executable","param1","param2"]
executableをそのまま実行します。
JSONフォーマットで指定します。
- パターン3
# as default parameters to ENTRYPOINT CMD ["param1","param2"]
ENTRYPOINTのデフォルトパラメーターとして使用されます。
ENTRYPOINTと一緒に使います。
ENTRYPOINT
docker run実行時、オプションを指定しなくても自動的に実行するコマンドを指定します。
おもにdockerをデーモンモードとして使うときに指定します。
shell formの場合、/bin/sh -cのサブコマンドとして実行されます。
Unix signalsが受け取れないため、docker stop <container>時にSIGTERMが受け取れません。Dockerfileで指定したENTRYPOINTは、コマンドオプション-entrypointでオーバーライドすることも出来ます。
指定できるのは、binaryのみでsh -cを指定できません。
2つの形式があります。
- パターン1
ENTRYPOINT ["executable", "param1", "param2"]
- パターン2 (shell form)
ENTRYPOINT command param1 param2
EXPOSE
コンテナで解放するポート番号を指定します。
EXPOSE <port> [<port>...]
COPY
コンテナイメージを作成する際、ホスト側からコンテナへファイルやディレクトリをコピーします。
2つの形式があります。
- パターン1
COPY <src>... <dest>
- パターン2 (パス内に空白が含まれる場合はこちらを利用します。)
COPY ["<src>",... "<dest>"]
ADD
srcに指定したものを、コンテナ内のdestに指定した箇所へコピーします。
srcには、ファイル、ディレクトリ、URLが指定できます。srcには、*,?がワイルドカードとして指定できます。destには、絶対パスを指定します。相対パスを指定するにはWORKDIRと一緒に使用します。- 作成されるファイルやディレクトリは、
UIDとGIDが 0 で作成されます。 srcにtarファイル形式の圧縮ファイル(gzip,bzip2,xz)が指定された場合、自動解凍されてディレクトリとしてコピーされます。
2つの形式があります。
- パターン1
ADD <src> <dest>
- パターン2 (パス内に空白が含まれる場合はこちらを利用します。)
ADD ["<src>", "<dest>"]
ENV
環境変数を指定します。
- パターン1 (単体定義用)
ENV <key> <value>
- パターン2 (複数定義用)
ENV <key1>=<value1> <key2>=<value2>
定義したkeyは$keyや${key}のように利用できます。
VOLUME
コンテナ内のホストや他のコンテナからのマウントポイントを明示します。
- パターン1 (JSONフォーマット)
VOLUME ["/path/to/dir1", "/path/to/dir2"]
- パターン2 (プレーンテキスト)
VOLUME /path/to/dir1 /path/to/dir2
USER
RUN,CMD,ENTRYPOINTを実行するユーザを指定します。
ユーザは、ユーザ名かUIDで指定します。
USER <UserName or UID>
LABEL
コンテナイメージにメタデータを登録します。
主に管理上のバージョン情報やイメージの説明と言ったようなことを記載するのに使用します。
この情報はdocker inspectで確認できます。
また、メタデータは継承されたこイメージにも継承されます。上書きすることも可能です。
LABEL <key1>=<value1> <key2>=<value2> <key3>=<value3> ...
WORKDIR
RUN,CMD,ENTRYPOINT,COPY,ADDを実行する時のワーキングディレクトリを指定します。
WORKDIR /path/to/workdir
下記例のように複数指定した場合、2つ目以降の相対パスでWORKDIRは、その前に指定した場所からの場所になるので、この例の場合のpwdコマンドの結果は/a/b/cになります。
WORKDIR /a WORKDIR b WORKDIR c RUN pwd
ONBUILD
コンテナイメージAがコンテナイメージBの構築のためのベースとして使用される場合に、コンテナイメージAで定義して、それをベースとしたコンテナイメージBのビルド時に実行されるようにトリガー登録するためのものです。
また、ONBUILDで作成したトリガーは、孫イメージには継承されません。
コンテナイメージAで登録されたトリガーは、それを継承したコンテナイメージBで実行されて消去されるため、コンテナイメージBを継承したコンテナイメージCでは実行できません。
ONBUILD [INSTRUCTION]