🪣

DockerにおけるENTRYPOINTとCMDの関係と上書き方法

に公開

Dockerにおけるエンドポイント(ENTRYPOINT)とコマンド(CMD)は、コンテナの実行方法を定義するための指示ですが、それぞれ異なる役割を持っています。

ENTRYPOINT

  • ENTRYPOINT はコンテナが実行する主なプロセスを定義します。
  • 常に実行されるプロセスを指定するために使用されることが多く、指定されたコマンドはコンテナが起動するときに必ず実行されます。
  • ENTRYPOINT は配列形式または文字列形式の2つの形式で指定できます。
    • 配列形式: ENTRYPOINT ["executable", "param1", "param2"]
    • 文字列形式: ENTRYPOINT command param1 param2
  • コンテナが実行される際に引数を渡すことができ、これにより柔軟なコンテナの起動が可能です。

CMD

  • CMD はデフォルトで実行されるコマンドまたは引数を指定します。
  • CMD はコンテナ起動時にオーバーライドされることが多く、主にデフォルト値として機能します。
  • CMD も配列形式または文字列形式で指定できます。
  • ENTRYPOINT が指定されている場合、CMD はその引数として渡されます。

上書きの方法

  • ENTRYPOINTCMD を上書きするためには、Dockerのdocker runコマンドにオプションを追加して実行します。

  • ENTRYPOINT を上書きする場合:

    docker run --entrypoint [new_executable] [image_name] [args]
    
    
  • CMD を上書きする場合:

    docker run [image_name] [new_command] [args]
    
    

例えば、以下のDockerfileがあるとします。

FROM ubuntu
ENTRYPOINT ["echo"]
CMD ["Hello, World!"]

このDockerfileでビルドしたイメージを実行すると、出力は Hello, World! になります。

CMDを上書きする例:

docker run [image_name] "Goodbye, World!"

上記のコマンドを実行すると、出力は Goodbye, World! になります。

ENTRYPOINTを上書きする例:

docker run --entrypoint ["ls"] [image_name]

上記のコマンドでは、コンテナ内で ls コマンドが実行され、そのリストが表示されます。

まとめ

  • ENTRYPOINT はコンテナのメインプロセスを定義し、常に実行されます。
  • CMD はデフォルトの引数やコマンドを指定し、必要に応じてオーバーライドされます。
  • どちらも docker run コマンドでオーバーライド可能です。

Note

Discussion