きちんと理解したら全然意味が異なるものだった
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"
とかすれば、任意のコマンドを実行できる
まとめ
ENTRYPOINT
はdocker run
時に実行されるコマンドを定めるCMD
はdocker run
時のデフォルトを定める。デフォルトとは-
ENTRYPOINT
のデフォルトの引数 - デフォルトで実行されるコマンド
-
おまけ
ENTRYPOINT
と CMD
両方が実行可能な場合、CMD
は無視される様子
FROM ubuntu:latest ENTRYPOINT ["/bin/sh", "-c", "echo 123"] CMD ["/bin/sh", "-c", "echo aaaa"]
これを docker run
すると、123
が出力される
感想
メジャーなコンテナのDockerfileを見たけど、CMD
単一定義のものも多いので、そこまで厳密に定めなくても良いような気もしてきた