はじめに
この記事では、Dockerfileの2つの必要不可欠な命令であるCMD
とENTRYPOINT
について説明します。
CMD
CMD
(Commandの略)は、Dockerfileの命令の1つであり、コンテナが生成されたイメージから実行された場合に実行されるデフォルトのコマンドを設定することができます。このコマンドは、実行時に異なるコマンドを指定することで上書きすることができます。CMD
は、コンテナのデフォルトの動作や追加のパラメータを提供するために役立ちます。
構文
Syntax
CMD ["executable", "param1", "param2"]
もしくは
CMD command param1 param2
例
FROM ubuntu
CMD ["echo", "Hello, World!"]
この例では、コンテナのデフォルトのコマンドはecho "Hello, World!"
になります。コンテナが実行されると、このコマンドが実行されますが、実行時に異なるコマンドが指定された場合は上書きされます。
ENTRYPOINT
ENTRYPOINT
は、別のDockerfileの命令であり、コンテナのデフォルトの実行可能ファイルを指定します。CMD
と異なり、ENTRYPOINT
は実行時にコマンドを簡単に上書きすることができません。代わりに、実行時に追加の引数が提供されると、それらはENTRYPOINT
コマンドに追加されます。これにより、ENTRYPOINT
は、コンテナで特定の実行可能ファイルまたはアプリケーションを実行する場合に特に有用です。
構文
ENTRYPOINT ["executable", "param1", "param2"]
もしくは
ENTRYPOINT command param1 param2
例
FROM ubuntu
ENTRYPOINT ["tail", "-f", "/dev/null"]
この例では、ENTRYPOINT
コマンドは、コンテナが常にtail
コマンドを-f
と/dev/null
のパラメータで実行するようにします。実行時に追加の引数が渡された場合は、このコマンドに追加されます。
主な違い
-
動作の上書き
CMD
は、実行時に新しいコマンドを指定することで簡単に上書きできますが、ENTRYPOINT
は特定の実行可能ファイルを強制するために設計されており、実行時に追加の引数がコマンドに追加されます。 -
柔軟性
CMD
はユーザーにとってより柔軟であり、ランタイムでコンテナのデフォルトの動作を定義または変更できますが、ENTRYPOINT
はより厳格であり、特定のアプリケーションまたは実行可能ファイルを強制します。 -
目的の使用
CMD
は、デフォルトの動作や追加のパラメータを提供するために最適であり、ENTRYPOINT
は、コンテナ内で常に特定のアプリケーションが実行されるようにするために最適です。
CMDとENTRYPOINTを一緒に使用
CMD
とENTRYPOINT
を組み合わせて、多様で強力なコンテナ構成を作成することができます。組み合わせると、ENTRYPOINT
はデフォルトの実行可能ファイルを設定し、CMD
は実行時に上書き可能なデフォルト引数を提供します。
FROM python:3.8
ENTRYPOINT ["python", "app.py"]
CMD ["--host", "0.0.0.0", "--port", "8000"]
この例では、ENTRYPOINT
はpython実行可能ファイルを使用してapp.py
スクリプトを実行するように指定します。その後、CMD
命令はコンテナのデフォルトの引数を設定し、ホストを0.0.0.0
、ポートを8000
に設定します。コンテナが実行されると、実行時に追加の引数が渡されると、デフォルトのCMD
引数が置き換えられます。