DockerfileにおけるCMDとENTRYPOINTの違いを日本語で解説
Dockerfileは、Dockerイメージを作成するためのテキストファイルです。その中で、CMD
とENTRYPOINT
は、コンテナが起動されたときに実行されるコマンドを指定するために使用されます。
CMD
- 役割: コンテナが実行される際のデフォルトのコマンドを指定します。
- 変更可能:
docker run
コマンドでオーバーライドすることができます。 - 用途:
- コンテナのデフォルトの動作を定義する。
- コンテナのヘルプメッセージや使用方法を表示する。
- コンテナが起動されたときに実行される特定のスクリプトやコマンドを指定する。
例:
CMD ["nginx", "-g", "daemon off;"]
この例では、コンテナが起動されたときに、nginxサーバーがデフォルトで実行されます。
ENTRYPOINT
- 用途:
- コンテナのメインプロセスを定義する。
- コンテナの機能や目的を明確にする。
- コンテナが実行される際の環境設定を定義する。
ENTRYPOINT ["/bin/sh", "-c", "exec nginx"]
具体的な違い
- 変更可能性:
CMD
は変更可能ですが、ENTRYPOINT
は変更できません。 - 用途:
CMD
はデフォルトの動作やヘルプメッセージを指定するために使用され、ENTRYPOINT
はメインプロセスや環境設定を指定するために使用されます。
CMDの例
例1: デフォルトのコマンドを指定する
CMD ["nginx", "-g", "daemon off;"]
例2: コンテナのヘルプメッセージを表示する
CMD ["bash", "-c", "echo 'This is a simple container.'"]
この例では、コンテナが起動されたときに、"This is a simple container."というメッセージが表示されます。
例1: コンテナのメインプロセスを指定する
ENTRYPOINT ["/bin/sh", "-c", "exec nginx"]
例2: コンテナの環境設定を定義する
ENTRYPOINT ["/bin/sh", "-c", "source /etc/profile && exec nginx"]
この例では、コンテナが起動されたときに、環境変数を設定してからnginxサーバーを実行します。
CMDとENTRYPOINTの組み合わせ
例: デフォルトのコマンドを指定し、エントリポイントをオーバーライドする
ENTRYPOINT ["/bin/sh", "-c", "exec nginx"]
CMD ["nginx", "-g", "daemon off;"]
この例では、エントリポイントとしてnginxサーバーが指定されていますが、デフォルトのコマンドとしてnginxサーバーが指定されているため、コンテナが起動されたときにnginxサーバーが実行されます。
- CMD: デフォルトのコマンドを指定し、
docker run
コマンドでオーバーライドすることができます。 - ENTRYPOINT: エントリポイントを指定し、
docker run
コマンドでオーバーライドすることはできません。
Dockerfileの他の指令
Dockerfileには、CMD
とENTRYPOINT
以外にも、コンテナの起動時の動作を制御するための指令が存在します。
- LABEL: コンテナに関するメタデータを指定する。
- VOLUME: コンテナのボリュームをマウントする。
- EXPOSE: コンテナが公開するポートを指定する。
- WORKDIR: コンテナの作業ディレクトリを指定する。
- COPY: ホストからのファイルをコンテナにコピーする。
- ADD: ホストからのファイルをコンテナにコピーし、圧縮ファイルを解凍する。
シェルスクリプトの使用
CMD
やENTRYPOINT
の代わりに、シェルスクリプトを使用することもできます。シェルスクリプトは、複数のコマンドを組み合わせたり、条件分岐やループ処理を実装することができ、より複雑な起動処理を実現することができます。
ENTRYPOINT ["/bin/sh", "-c", "./entrypoint.sh"]
entrypoint.sh
というシェルスクリプトを作成し、その中で必要なコマンドを実行します。
Docker Composeの使用
version: '3.7'
services:
web:
image: nginx:latest
command: nginx -g daemon off;
この例では、Docker Composeを使用してnginxコンテナを起動し、CMD
指令を使用してデフォルトのコマンドを指定しています。
具体的な比較
指令 | 説明 |
---|---|
CMD | デフォルトのコマンドを指定する |
ENTRYPOINT | エントリポイントを指定する |
LABEL | コンテナのメタデータを指定する |
VOLUME | コンテナのボリュームをマウントする |
EXPOSE | コンテナが公開するポートを指定する |
WORKDIR | コンテナの作業ディレクトリを指定する |
COPY | ホストからのファイルをコンテナにコピーする |
ADD | ホストからのファイルをコンテナにコピーし、圧縮ファイルを解凍する |
シェルスクリプト | 複数のコマンドを組み合わせたり、条件分岐やループ処理を実装することができる |
Docker Compose | 複数のコンテナをまとめて管理するためのツール |
docker docker-entrypoint docker-cmd