Open1

dockerのCMDとENTRYPOINT

0w00w0

何番煎じかというトピックですが。。
背景として、公式を参考に、dbtの開発環境用のDockerコンテナを作成していたのですが、ENTRYPOINT ['dbt']の記述を残す必要があるのかどうか分からず。。良くCMDと比較されるので、そちらと一緒に調べました。

CMDについて

始めに、docker runにおけるCOMMANDの位置づけです。

https://docs.docker.com/engine/reference/commandline/run/
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
The docker run command first creates a writeable container layer over the specified image, and then starts it using the specified command

説明にあるように、runによりimageからコンテナが作成され、その後、指定されたCOMMANDとともにコンテナが起動します。

次にDockerfile内のCMDの位置づけです。

https://docs.docker.com/engine/reference/builder/#cmd
The main purpose of a CMD is to provide defaults for an executing container.
...
If the user specifies arguments to docker run then they will override the default specified in CMD.

上記の説明にあるように、CMDはコンテナ実行のデフォルト(コマンド)として利用されます。一方で、docker runでCOMMANDを指定した場合、そちらが優先されます。

まとめると、docker run時の引数で上書きすること可能な、コンテナ起動時に実行されるコマンドということになります。

ENTRYPOINTについて

https://docs.docker.com/engine/reference/builder/#entrypoint
An ENTRYPOINT allows you to configure a container that will run as an executable.
...
Command line arguments to docker run <image> will be appended after all elements in an exec form ENTRYPOINT, and will override all elements specified using CMD

ENTRYPOINTはコンテナを(lsなどのシェルのような)実行可能なものとして利用できるようにします。
docker run [OPTIONS] IMAGEの後に続く引数はすべて、ENTRYPOINTの引数として利用されます。

つまり、例えばENTRYPOINT ["ls"]を指定すると、

  • docker run <image>では引数無しで ls が実行される(ここだけはCMDと同様)
  • docker run <image> の引数を ls の引数として利用可能
    • 例えばdocker run <image> -alls -al がコンテナ起動時に実行される
  • lsdocker run の引数で上書きすることができない

という状態を作れるようです。

docker run <image>lsのような動作(Executable)をさせられる、ということがコンセプトのようです。

結論

コンテナの外側からdbd commandを実行したいわけではないので、ENTRYPOINTは不要そうですね :)