技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

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