繁体   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