DockerfileにおけるCMDとENTRYPOINTの違いを日本語で解説

2024-08-27

Dockerfileは、Dockerイメージを作成するためのテキストファイルです。その中で、CMDENTRYPOINTは、コンテナが起動されたときに実行されるコマンドを指定するために使用されます。

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には、CMDENTRYPOINT以外にも、コンテナの起動時の動作を制御するための指令が存在します。

  • LABEL: コンテナに関するメタデータを指定する。
  • VOLUME: コンテナのボリュームをマウントする。
  • EXPOSE: コンテナが公開するポートを指定する。
  • WORKDIR: コンテナの作業ディレクトリを指定する。
  • COPY: ホストからのファイルをコンテナにコピーする。
  • ADD: ホストからのファイルをコンテナにコピーし、圧縮ファイルを解凍する。

シェルスクリプトの使用

CMDENTRYPOINTの代わりに、シェルスクリプトを使用することもできます。シェルスクリプトは、複数のコマンドを組み合わせたり、条件分岐やループ処理を実装することができ、より複雑な起動処理を実現することができます。

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



Dockerコンテナのファイルシステム探索に関するコード例解説

Dockerコンテナは、アプリケーションとその依存関係をパッケージ化された環境として提供します。コンテナの内部は、ホストマシンのファイルシステムとは独立しています。この独立性は、コンテナのポータビリティとセキュリティを確保するために重要です。...



docker entrypoint cmd

Dockerと仮想マシンの違いについての日本語解説 (コード例付き)

Dockerと仮想マシンは、どちらもアプリケーションの隔離と実行環境を提供する技術ですが、その仕組みや用途に大きな違いがあります。ハードウェアの仮想化: 仮想マシンは、物理的なコンピュータ上で複数の仮想的なコンピュータをエミュレートします。これにより、複数のオペレーティングシステムを同時に実行することが可能になります。


「VagrantとDockerで隔離環境を作成するべきか?」を日本語で解説

VagrantとDockerは、どちらも開発環境を隔離して管理するためのツールですが、その目的と使用方法が異なります。目的: 仮想マシンを管理し、異なるオペレーティングシステムやソフトウェア構成で開発環境を隔離する。使い方:Vagrantfileを作成し、仮想マシンの設定を定義する。vagrant upコマンドで仮想マシンを起動する。仮想マシン内で開発を行う。


ホストからDockerコンテナのIPアドレスを取得するコード例の詳細解説

Dockerコンテナは、ホストマシン上で隔離された環境を提供します。コンテナ同士、またはホストとコンテナ間の通信を行うためには、コンテナのIPアドレスが必要になります。この文書では、ホストからDockerコンテナのIPアドレスを取得する方法について説明します。


Dockerの古いコンテナ削除に関するコード例解説

Dockerは、アプリケーションをパッケージ化して実行するコンテナ化プラットフォームです。時間が経つと、使用されていないコンテナが蓄積され、ディスクスペースを占有する可能性があります。これらを削除するには、次のコマンドを使用します。docker ps -a -q: すべてのコンテナのIDを取得します。


Dockerコンテナの実行についての日本語解説

Dockerは、アプリケーションとその依存関係をパッケージ化して、異なる環境で一貫して実行するためのプラットフォームです。Dockerイメージは、このパッケージのテンプレートであり、アプリケーションのコード、ライブラリ、設定ファイルなどの構成要素を含んでいます。