docker 文件中的 CMD 与 docker-compose.yml 中的命令

CMD in dockerfile vs command in docker-compose.yml

有什么区别?

哪个是首选?

如果定义了command,是否应该省略CMD?

command 覆盖 dockerfile 中的 CMD。 如果你自己控制 dockerfile ,就把它放在那里。这是最干净的方式。

如果您想测试某些东西或需要在开发过程中更改 CMD 比总是更改 dockerfile 并重建映像要快。

或者,如果它是一个预构建的图像,并且您不想构建派生的 FROM ... 图像只是为了更改 CMD,这也是一个快速解决方案,方法是 command.

在通常情况下,您应该有一个 Dockerfile CMD 而不是 Compose command:

Compose 文件中的

command: 覆盖 Dockerfile 中的 CMD。有一些细微的语法差异(值得注意的是,Compose 永远不会自动为您插入 sh -c shell 包装器)但它们在容器元数据中控制相同的东西。

但是,请记住,除了 Compose 之外,运行 容器还有其他方法。 docker run 不会读取您的 docker-compose.yml 文件,因此不会看到 command: 行;它也不会在 Kubernetes 等工具中读取。如果将 CMD 构建到图像中,它将在所有这些地方得到尊重。

如果您需要为容器启动 non-default 主进程,您确实需要 command: 覆盖的地方。

假设您正在构建一个 Python 应用程序。您可能有一个 Django 主应用程序和一个 Celery worker,但它们具有基本相同的源代码。因此,对于此设置,您可以使图像的 CMD 启动 Django 服务器,并覆盖 command: 到 运行 同一图像的 Celery worker。

# 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