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)