[英]CMD in dockerfile vs command in docker-compose.yml
有什么區別?
哪個是首選?
如果定義了命令,是否應該省略 CMD?
command
覆蓋dockerfile
中的CMD
。 如果您自己控制dockerfile
,請將其放在那里。 這是最干凈的方式。
如果您想測試某些東西或需要在開發時更改CMD
,它比總是更改dockerfile
並重建映像要快。
或者,如果它是預構建的映像,並且您不想構建派生的FROM ...
映像只是為了更改CMD
,那么它也是通過command
執行此操作的快速解決方案。
在常見情況下,您應該有一個 Dockerfile CMD
而不是 Compose command:
.
command:
在 Compose 文件中覆蓋 Dockerfile 中的CMD
。 有一些細微的語法差異(值得注意的是,Compose 永遠不會為您自動插入sh -c
shell 包裝器),但它們在容器元數據中控制相同的東西。
但是,請記住,除了 Compose 之外,還有其他方法可以運行容器。 docker docker run
不會讀取您docker-compose.yml
文件,因此不會看到該command:
line; 它也沒有在 Kubernetes 等工具中讀取。 如果您將CMD
構建到映像中,它將在所有這些地方都受到尊重。
您確實需要command:
override 的地方是您需要為容器啟動非默認主進程。
想象一下,您正在構建一個 Python 應用程序。 你可能有一個主 Django 應用程序和一個 Celery worker,但它們的源代碼基本相同。 因此,對於此設置,您可以使圖像的CMD
啟動 Django 服務器,並覆蓋command:
以在同一圖像上運行 Celery 工作者。
# Dockerfile
# ENTRYPOINT is not required
CMD ["./manage.py", "runserver", "0.0.0.0:8080"]
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports: ['8080:8080']
# no command:
worker:
build: .
command: celery worker
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.