Dockerfile

ベストプラクティス

参考:

ADDとCOPY

http://docs.docker.jp/engine/userguide/eng-image/dockerfile_best-practice.html#add-copy

  • COPY で間に合うときは COPY を使うべき
  • ADD は圧縮ファイルの展開などの機能もある

.dockerignore

https://docs.docker.jp/engine/reference/builder.html#dockerignore

ADDやCOPYによってDockerイメージに含めたくないファイルを記しておく。

参考:

Syntax

環境変数の利用

http://docs.docker.jp/engine/reference/builder.html#environment-replacement

  • 全てではないが、一部の命令で環境変数の利用がサポートされている。
  • ENV 命令で環境変数をセットすることもできる。
  • コンテナ実行時に環境変数をセットする際は docker run-e KEY=${VALUE} の形で渡す。
    • これらを CMDENTRYPOINT で解釈する際は、exec形式(= ["実行コマンド", "引数"...]の形式)では展開されないため、シェル形式(= 実行コマンド 引数...)で記す必要がある。
    • または、ラッパースクリプトを指定するという手もアリだろう。

Instructions

CMD

コンテナのデフォルトの実行コマンド、またはその引数を指定する。

CMD ["実行ファイル", "ARG1", "ARG2", ...] # exec実行形式
CMD ["ARG1", "ARG2", ...] # ENTRYPOINTのデフォルト引数
CMD <コマンド...> # シェル形式
  • 2番目は ENTRYPOINT を指定した時、その引数となる。
    • docker run <コンテナ> 引数... として上書きできる
  • 1, 3番目の形式は ENTRYPOINT と一緒には指定できない(はず…)
    • シェル形式の場合、 /bin/sh -c で起動されるようだ

ENTRYPOINT

コンテナのデフォルトの実行コマンドを指定する。

ENTRYPOINT ["実行ファイル", "ARG1", "ARG2", ...] # exec形式
ENTRYPOINT 実行ファイル ARG1 ARG2 ... # シェル形式
  • 上書きするには --entrypoint <コマンド...> とする。
  • シェル形式の場合、 /bin/sh -c で起動されるようだ
  • CMD でデフォルト引数を与えると、 ENTRYPOINT として指定した「コマンド + 引数」の後に CMD として与えた引数がくっつく。
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

このコンテナを docker run で動かすと、 top -b -c が実行される。

CMD の方はコマンドラインで普通に上書きされる。
上のDockerfileを ubuntu-top としてビルドして例を示す:

docker run --rm -it ubuntu-top       # top -b -c が実行される
docker run --rm -it ubuntu-top -n 1  # top -b -n 1 が実行される

参考:

VOLUME

docker run-v オプションに相当。
ホストのディレクトリをコンテナにマウントする。

参考:

Tips

CMDとENTRYPOINTがどう作用するか

http://docs.docker.jp/engine/reference/builder.html#cmd-entrypoint