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
有什么区别?
哪个是首选?
如果定义了command,是否应该省略CMD?
command
覆盖 dockerfile
中的 CMD
。
如果你自己控制 dockerfile
,就把它放在那里。这是最干净的方式。
如果您想测试某些东西或需要在开发过程中更改 CMD
比总是更改 dockerfile
并重建映像要快。
或者,如果它是一个预构建的图像,并且您不想构建派生的 FROM ...
图像只是为了更改 CMD
,这也是一个快速解决方案,方法是 command
.
在通常情况下,您应该有一个 Dockerfile CMD
而不是 Compose command:
。
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