はじめに
この記事では、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引数が置き換えられます。