Dockerfile
- 公式リファレンス: https://docs.docker.com/engine/reference/builder/
- 邦訳: Dockerfile リファレンス — Docker-docs-ja ドキュメント
ベストプラクティス
参考:
- Introduce that Best practices for writing Dockerfiles … 2018年12月Japan Container Daysでのモリハヤさんの発表
- 効率的に安全な Dockerfile を作るには - Qiita
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}
の形で渡す。- これらを
CMD
やENTRYPOINT
で解釈する際は、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
最終更新 2022-06-22: [docker] Add page about Docker Image (e602a23ba)