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での実行結果がイメージとなる。