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