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

Yus*_*sif 8 docker dockerfile docker-compose

有什么不同?

哪个是首选?

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

Dav*_*aze 18

在常见情况下,您应该有一个 DockerfileCMD而不是 Compose command:

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

但是,请记住,除了 Compose 之外,还有其他方式来运行容器。 docker run不会读取您的docker-compose.yml文件,因此不会看到该command:行;它也不会在 Kubernetes 等工具中读取。如果你把它融入CMD到形象中,它就会在所有这些地方受到尊重。

command:如果您需要为容器启动非默认主进程,则确实需要覆盖。

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

# Dockerfile
# ENTRYPOINT is not required
CMD ["./manage.py", "runserver", "0.0.0.0:8080"]
Run Code Online (Sandbox Code Playgroud)
# docker-compose.yml
version: '3.8'
services:
  web:
    build: .
    ports: ['8080:8080']
    # no command:
  worker:
    build: .
    command: celery worker
Run Code Online (Sandbox Code Playgroud)


ara*_*sch 10

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

如果您想测试某些内容或需要在开发时更改,CMD它比总是更改dockerfile并重建映像要快。

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