簡體   English   中英

dockerfile 中的 CMD 與 docker-compose.yml 中的命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM