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