開発用の環境構築などに重宝しているdockerですが、
CMD命令とENTRYPOINT命令の違いについてメモしておく。
CMD, ENTRYPOINT命令はともにdocker run した後に実行される
プロセス起動用のコマンドなどを記載しておくもの。
Dockerfileに記述できるCMD, ENTRYPOINT命令はそれぞれ一つずつ。
複数記述した場合、最後の命令のみ実行される。
CMD命令
コンテナ起動後(run)に実行されるコマンド
docker run -d my-image
# ==> Dockerfileに記載のCMD命令が実行される。
docker run コマンドに実行コマンドを引数として渡した場合には、
Dockerfileに記載した CMD命令は実行されなくなります。
docker run -d my-image <CMD>
# ==> Dockerfileに記載のCMD命令は引数で指定したCMDで上書きされる。
Dockerfile内に複数のCMD命令があると
最後の命令のみ有効となります。
ENTRYPOINT命令
CMD命令と同じように、
コンテナ起動後(run)に実行されるコマンドを指定できる。
違いはCMD命令とは異なり、runコマンドの引数で上書きする事ができない。
DockerfileでCMD命令とENTRYPOINT命令を指定している場合、最後のENTRYPOINT命令のみ有効となります。
ENTRYPOINTで記述した場合、docker run コマンドの引数でコマンドを指定しても無視されるため、
Dockerfile作成者の意図通りにプロセスが起動することになります。
組み合わせる
ENTRYPOINTとCMD命令を組み合わせると、
ENTRYPOINTで、指定したコマンドに渡す引数をデフォルトで指定するといった使い方がてきます。
docker run 引数を渡した場合は、
CMD命令が上書きされ、ENTRYPOINT で指定したコマンドに任意で引数を渡す事ができる。