概要
Dockerfileに記載するCMD命令とdocker-compose.ymlに記載するcommandの使い分けが曖昧で
自分なりに調べたのでメモとして残しておきます。
なお、Dockerについて詳しく知りたい場合は下記公式ドキュメントを参照してください。
Docker公式ドキュメント
DockerfileのCMD命令とは
CMDとはDockerfileに記載できる命令のひとつです。docker runでコンテナを起動した際に
コンテナで実行したいコマンドを記載することができます。
コード例
Dockerfile
FROM ruby:3.0.3
# 省略
CMD ['bundle', 'exec', 'rails', 's', '-p', '3000', '-b', '0.0.0.0']
これはrailsを起動し、外部からの通信を許可し3000番ポートで待ち受けるコマンドです。
docker-composeのcommandとは
commandはdocker-compose.ymlで記載でき、docker-compose upでコンテナを起動した際に
実行したいコマンドを記載するところです。
コード例
docker-compose.yml
web:
# 省略
command: bundle exec rails s -p 3000 -b '0.0.0.0'"
疑問点
docker-composeを使っているときは
docker-compose.ymlとDockerfileどっちに実行コマンドを記載するのがいいのだろうか。
結論
docker-compose.ymlに記載すればいいです。
docker-compose.ymlに実行コマンドを記載した場合、Dockerfileに記載されているCMDは無視されます。
よって基本的にdocker-compose.ymlにすべて記載する方向で間違いないと思います。
まとめ
docker runで個別のコンテナに対してコマンドを実行する場合は、Dockerfile内にCMDを記載して、
docker-composeで複数のコンテナを管理している場合はdocker-compose.ymlに記載する。