dockerのCMDとENTRYPOINT

何番煎じかというトピックですが。。
背景として、公式を参考に、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> -al
でls -al
がコンテナ起動時に実行される
- 例えば
-
ls
をdocker run
の引数で上書きすることができない
という状態を作れるようです。
docker run <image>
がls
のような動作(Executable)をさせられる、ということがコンセプトのようです。
結論
コンテナの外側からdbd commandを実行したいわけではないので、ENTRYPOINTは不要そうですね :)