aspec7's garage

エンジニア生活の中で学んだことの備忘録

Dockerfileの命令を理解して、よりDockerを有効活用したい!

f:id:aspec7:20150627181738j:plain

なんとなくでも、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

コンテナイメージを作成する際、ホスト側からコンテナへファイルやディレクトリをコピーします。

  • srcには、*,?を使った条件一致を使えます。
  • destには、絶対パスで指定します。相対パスを指定するには、WORKDIRと一緒に使用します。

2つの形式があります。

  • パターン1
COPY <src>... <dest>
  • パターン2 (パス内に空白が含まれる場合はこちらを利用します。)
COPY ["<src>",... "<dest>"]

ADD

srcに指定したものを、コンテナ内のdestに指定した箇所へコピーします。

  • srcには、ファイルディレクトリURLが指定できます。
  • srcには、*,?ワイルドカードとして指定できます。
  • destには、絶対パスを指定します。相対パスを指定するにはWORKDIRと一緒に使用します。
  • 作成されるファイルやディレクトリは、UIDGID0 で作成されます。
  • 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]