DockerfileのCMDとENTRYPOINTの違い
Dockerfile作成時に頻繁に使用する2つの命令、CMD
とENTRYPOINT
について解説します。この2つの命令は、コンテナの実行時のコマンドや引数を指定するために使われますが、その使い方や役割には差異があります。
CMDとENTRYPOINTの基本
- Dockerfileでは、
CMD
とENTRYPOINT
をそれぞれ何度でも記述することが可能です。しかし、各命令が複数回記述されている場合、その中の最後に記述されたものだけが最終的に使用されます。つまり、1つのDockerfileで有効なCMD
とENTRYPOINT
はそれぞれ1つずつということです。 -
CMD
とENTRYPOINT
が指定するコマンドや引数は、docker run
の実行時にコンテナ内で動作します。
ENTRYPOINT
ENTRYPOINT
命令は、コンテナを起動するときに必ず実行されるコマンドを指定します。このコマンドはdocker run
の際に--entrypoint
オプションを使用して上書きすることができます。
CMD
一方、CMD
命令はENTRYPOINT
で指定されたコマンドの引数またはENTRYPOINT
が指定されていない場合のデフォルトのコマンドを決める役割を果たします。docker run
の実行時に簡単に上書きすることが可能です。また、引数が不要な場合は、ENTRYPOINT
のみで十分です。
例えば以下のDockerfileでは、
FROM ubuntu
ENTRYPOINT ["echo"]
CMD ["Hello, Docker!"]
ここでは、ENTRYPOINT
で"echo"というコマンドを指定し、その引数として"Hello, Docker!"をCMD
で定義しています。これによりENTRYPOINT
のコマンドが固定され、CMD
で指定した引数は必要に応じて上書きすることができます。
例えば、次のように実行すると:
docker run <イメージ名> "Hello, World!"
出力は「Hello, World!」になり、CMD
で指定したデフォルトの引数が上書きされた結果が結果として出力されます。
一方、引数が不要な場合、ENTRYPOINT
のみでもコマンドの実行は可能です。その場合、CMD
の指定は不要です。
例えば、次のようなDockerfileであれば
FROM ubuntu
ENTRYPOINT ["echo", "Hello, Docker!"]
これをコンテナとして実行した場合、"Hello, Docker!"が常に出力されます。
そのため、Dockerfileでは通常、CMD
とENTRYPOINT
を組み合わせて使用します。それにより、ENTRYPOINT
で実行するコマンドを固定し、そしてCMD
でデフォルトの引数を設定します。そして、固定のコマンドを実行し、引数を変更せずに実行したい場合には、ENTRYPOINT
だけを用いると便利です。
Discussion