@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

DockerfileでのCMDとENTRYPOINTの違い

ここを読んだメモ。

www.centurylinklabs.com

CMDでコマンドを指定していると,docker run image-name some commandのように上書きできる。

ENTRYPOINTは上書きさせたくないときに使う。ENTRYPOINTで指定されたコマンドを上書きするときはこう書くdocker run --entrypoint somecommand image-name複数パラメータどうすんだろ。いるときはドキュメント見る。

実行するコマンドをexecにするかどうかって話

CMDとかENTRYPOINTは/bin/sh -cの引数としてコマンドを実行する。なので、docker psなどで実行中のプロセスを見るとCMDなどで指定したコマンドだけでなく/bin/shも見えるとのこと。

execで実行すると/bin/shを介さずに,PIDが1で実行される. execでの実行方法は,実行したいコマンドと引数をJSONの配列形式でCMDやENTRYPOINTに渡す。

CMD ["somecommand", "someoption"]

あと,/bin/shを介すのでPOSIXのシグナルをコマンドまで渡してくれないらしい。

両方書くと?

ENTRYPOINTとCMDの両方を書くと、上書きできないものと上書きできるものの両方を実行することになる。しかも繋げてくれる.

元記事での例はping

ENTRYPOINT ["/bin/ping","-c","3″]
CMD ["localhost"]

こんなDockerfileだとする。普通にdocker run imagenameのように実行すると/bin/ping -c 3 localhostが実行される。 イメージ名の後ろにオプションを渡すとCMDを上書きするので,この場合ドメイン名指定すれば指定したドメインpingしてくれる。

docker run imagename peccu.hatenablog.comを実行すると,/bin/ping -c 3 peccu.hatenablog.comが実行される.

条件として、どちらもexec(JSONの配列でオプション指定)にしておかないといけない。 普通に書くとENTRYPOINTとCMDの間に/bin/shなどが挟まる。(/bin/sh -c '/bin/ping -c 3' /bin/sh -c 'localhost'みたいなコマンドになってしまう)