CMDとENTRYPOINT違いおぼえがき

きちんと理解したら全然意味が異なるものだった

ENTRYPOINTとは

docker run 時に実行されるコマンドを定義

apacheを起動させるコンテナ(オフィシャルじゃないけど、説明に最適だった)ENTRYPOINT

ENTRYPOINT ["/usr/sbin/apache2"]

docker run した場合 /usr/sbin/apache2 が実行される

  • ただし、--entrypoint オプションで変更可能

これがあるコンテナは、apacheのコンテナの様に単一の用途を持つという印象

CMDとは

docker run 時のコンテナのデフォルトを定義

この、「デフォルト」は2つの意味がある

  • docker run 時の ENTRYPOINTデフォルトの引数
  • docker run 時に デフォルトで実行されるコマンド

例1. ENTRYPOINT のデフォルトの引数

apache のコンテナCMD

CMD ["-D", "FOREGROUND"]

docker run した場合 ENTRYPOINT と合わせて /usr/sbin/apache2 -D FOREGROUND が実行される

もし、docker run に引数を与えた場合、CMD で定義された部分だけが置き換えられる

例えば、docker run -v を実行した場合、コンテナ上では /usr/sbin/apache2 -v が実行される

例2. デフォルトの振る舞い

alpine linuxのコンテナCMD

CMD ["/bin/sh"]

なので、

  • docker run -it とすれば、シェルに入ることができるし、
  • docker run -it echo "hello" とかすれば、任意のコマンドを実行できる

まとめ

  • ENTRYPOINTdocker run 時に実行されるコマンドを定める
  • CMDdocker run 時のデフォルトを定める。デフォルトとは
    • ENTRYPOINT のデフォルトの引数
    • デフォルトで実行されるコマンド

おまけ

ENTRYPOINTCMD 両方が実行可能な場合、CMD は無視される様子

FROM ubuntu:latest
ENTRYPOINT ["/bin/sh", "-c", "echo 123"]
CMD ["/bin/sh", "-c", "echo aaaa"]

これを docker run すると、123 が出力される

感想

メジャーなコンテナのDockerfileを見たけど、CMD 単一定義のものも多いので、そこまで厳密に定めなくても良いような気もしてきた