かべぎわブログ

技術的なことについてかけたらいいな…

DockerfileのCMDとENTRYPOINTの違い 使い分け

概要

Dockerfileを書いていて、CMDとENTRYPOINTという命令があって、どっちもコマンドを実行できて、これなんやねんと思ったので雑まとめ。

CMD

単純にコマンドを実行できる。
ただし、docker run時にコマンドを指定すると処理がうわがかれる。

たとえば以下のようなDockerfileがあったとする。

FROM centos
CMD echo "CMD"

それを普通にdocker runすればなんの問題もない。
echo "CMD"が実行される。

$ sudo docker run 7bb22e4b8dbe
CMD

ただしdocker runのときにたとえば以下のように実行したとする。

$ sudo docker run 7bb22e4b8dbe echo "wawawa"
wawawa

すると、Dockerfile内のCMDの記述が上書きされ、Dockerfile内で記載したecho "CMD"は実行されない。

なぜならCMDはDockerfile内に一つしか宣言できないから。

ENTRYPOINT

コマンドを実行できる。
CMDとは違い、docker run時にコマンドを指定しても処理がうわがきされない。
コンテナ実行時にかならず実行させたいものをここに記載する。

たとえば以下のようなDockerfileがあったとする。

FROM centos
ENTRYPOINT echo "ENTRYPOINT"

docker runのときにたとえば以下のように実行したとする。
CMDの場合はこれで処理が上書きされてしまっていたが

$ sudo docker run f74b3addb0bf echo "wawawa"
ENTRYPOINT

ENTRYPOINTは上書きされない。

ちなみにENTRYPOINTもDockerfile内に一つしか宣言できない。
複数宣言した場合は最後のENTRYPOINTが有効になる。

Docker

Docker