Dockerを使っていて、
CMDとENTRYPOINTの役割と違いがよくわからなかったので、調べたことをメモ
結論①「CMD」と「ENTRYPOINT」の役割
CMDとENTRYPOINTとは、どちらもDockerfileに記述するコマンドのこと。
役割としては、両者共に
「コンテナ実行時に、コンテナに対し実行したいコマンドを実行する」ことだ

結論②「CMD」と「ENTRYPOINT」の違い
「CMD」と「ENTRYPOINT」役割の違いとしては、簡単に言うと、
「CMD:変更部分担当、ENTRYPOINT:固定部分担当」ってとこだろうか。

CMDはENTRYPOINTの後に続くコマンドを指定する。
そのため、(固定の)ENTRYPOINTに対し変更可能性の高い内容をCMDに記述する
CMD:変更部分担当
ENTRYPOINT:固定部分担当
例として、ホストとの通信を確認するpingコマンドで使い方の例を紹介する。
Dockerfileを以下のように編集する。
ENTRYPOINT ["ping","-c","1"]
CMD ["localhost"]
ENTRYPOINTが、「pingを一回実行するよ」と言う固定部分。
CMDが「(pingを)localhostに対して」と言う変更可能性のある部分だ。
このイメージをビルドして実行すると「ping -c 1 localhost」が実行される。
CMDの挙動を確認
では実際に、CMDの挙動を確認していく。
まずはDockerfileにCMDを記述してイメージをビルドする。
下記ではコンテナ実行時に「test CMD」と出力するように記述。
## phpのイメージ
FROM php:7.3-apache
## CMD:コンテナ実行時に実行するデフォルト
CMD ["echo","test CMD"]
作ったイメージでコンテナ実行(引数なし)
docker run php:7.3-apache
出力内容
test CMD
CMDの記述(デフォルト)が実行されたのが分かる
次にコンテナ実行時、引数ありでの上書きを確認する。
docker run php:7.3-apache echo overWrite
出力内容
overWrite
出力内容が上書きされた。
ENTRYPOINTの挙動を確認
次にDockerfileにENTRYPOINTを記述してイメージをビルドする。
## phpのイメージ
FROM php:7.3-apache
## ENTRYPOINT:コンテナ実行時に必ず実行する
ENTRYPOINT ["echo","This is ENTRYPOINT"]
作ったイメージでコンテナ実行
docker run php:7.3-apache
出力内容
This is ENTRYPOINT
ENTRYPOINTの記述が実行されたのが分かる
CMDとENTRYPOINTの組み合わせの挙動を確認
最後にCMDとENTRYPOINTの組み合わせの挙動を確認する
CMDの記述が、ENTRYPOINTの記述の後に付け加えられることを確認する(内容は適当)
## phpのイメージ
FROM php:7.3-apache
## ENTRYPOINT:コンテナ実行時に必ず実行する
ENTRYPOINT ["echo","This is ENTRYPOINT"]
## CMD:コンテナ実行時に実行するデフォルト
CMD ["echo","test CMD"]
作ったイメージでコンテナ実行
docker run php:7.3-apache
出力内容
This is ENTRYPOINT echo test CMD
CMDの記述がENTRYPOINTの記述の後に付け加えられた
CMDとENTRYPOINTの「役割」と「違い」まとめ
役割としてはどちらも「コンテナ実行時に、コンテナに対し実行したいコマンドを実行する」ことに変わりはない。ただ違いとして、ENTRYPOINTは必ず実行するコマンド(固定)を記述するのに対し、CMDでは、ENTRYPOINTに続く、変更可能性の高い要素を記述する。
CMD:コンテナ実行時、デフォルトで実行したいコマンドを記載する。デフォルトなのでコンテナ自動時、引数で上書き可能。またENTRYPOINTの指定がある場合、ENTRYPOINTの指定の後に続けて付け加えられる。
ENTRYPOINT:コンテナ実行時に必ず実行したいコマンドを記載する。docker runするときに –entrypoint で上書き可能。