DockerfileのCMDとRUNの違い

Goでサーバーを起動する時にCMDかRUNで迷って、結果としてCMDが適切だった。
調べたことをまとめておく。

開発環境

> docker --version
Docker version 20.10.8, build 3967b7d

> docker-compose --version
docker-compose version 1.29.2, build 5becea4c

結論

  • CMD: コンテナ起動時に実行したい処理を書く
  • RUN: イメージ生成の一部として実行したい処理を書く

CMD

  • Dockerfile内で1度しか使えない
  • 複数ある場合は 最後 のみ有効
  • 主な目的は、コンテナ実行時のデフォルト(初期設定)を指定するため

CMDとENTRYPOINT

CMD と ENTRYPOINT の連携を理解 | Dockerfile リファレンス — Docker-docs-ja 20.10 ドキュメント

CMD と ENTRYPOINT 命令は、どちらもコンテナ起動時に何のコマンドを実行するか定義します。
https://docs.docker.jp/engine/reference/builder.html#entrypoint

どうやらCMDと似たENTRYPOINTというものがあるみたい。

CMDとENTRYPOINTの違い

CMD は、コンテナの実行時に、ほかの引数で上書きされる場合があります。
https://docs.docker.jp/engine/reference/builder.html#cmd-entrypoint

# `docker run -it {IMAGE} echo 1` で上書きされる
CMD go run main.go

# `docker run -it {IMAGE} --entrypoint "echo 1"` で上書きされない 
ENTRYPOINT go run main.go

書き換えられたくない処理はENTRYPOINTで書くのが良さそう。

RUN

RUN 命令は、現在のイメージよりも上にある新しいレイヤでコマンドを実行し、その結果を コミット(確定)commit します。結果が確定されたイメージは、 Dockerfile の次のステップで使われます。 https://docs.docker.jp/engine/reference/builder.html#id13

  • RUNでの実行結果がイメージとなる。

参考