DockerfileのENTRYPOINTとCMD【Docker】
Dockerfileには、ENTRYPOINTとCMDという項目があります。
- ENTRYPOINT
- 実行するプロセスを指定。
- docker runコマンド実行時に、ENTRYPOINTに書いてあるプロセス以外を指定できない。
- docker run時に指定できるのは、通常、引数だけ。
- ただし、run --entrypoint=""とすれば、上書き可能。
- CMD
- 実行するプロセスや引数を指定。
- docker run時にプロセスや引数が指定されている場合は無視される。
- ENTRYPOINTが指定されている場合はデフォルト引数を指定する。
このように、2つの項目がDockerfileに指定されていれば、docker run実行時に毎回同じプロセスや引数を指定する必要がなくなります。
例えばenvoyの公式Dockerfileには、
CMDとして["envoy", "-c", "/etc/envoy/envoy.yaml"]が指定されているので、
kubernetesによるデプロイ環境構築の際に、envoy(sidecar-pattern)を利用する場合は、
envoyのcommandを指定する必要もないですし、mountPassやファイル名を同じにすれば、argsにconfigのpassを指定する必要もなくなります。
ENTRYPOINTとCMDを指定するには、空白区切りの文字列方式か配列方式が選べます。
空白区切りの文字列方式の場合、「/bin/sh -c」が付与されて、プロセスがシェル経由で起動されます。
ENTRYPOINTの追加引数と指定するためのCMDであっても、「/bin/sh -c」が引数に付与されます。
シェル経由ですので、環境変数も展開されます。
配列方式の場合、exec形式でプロセスが起動されます。
「/bin/sh -c」が引数に付与されるのを望まないケースが多いので、配列方式が選ばれることも多いようです。
JSON配列としてパースされるため、ダブルクオートで囲みます。
なお、CMDをENTRYPOINTのデフォルト引数として使用する場合は、必ず配列方式にしなければなりません。
公式でも配列方式が推奨されています。
参考
Dockerfile リファレンス — Docker-docs-ja 1.11.0 ドキュメント
DockerfileのCMDとENTRYPOINTを改めて解説する - Qiita
https://github.com/envoyproxy/envoy/blob/master/ci/Dockerfile-envoy-image