Compose 常见问题解答
两者之间有什么区别docker compose
和docker-compose
Docker Compose 命令行Binaries的第一个版本于 2014 年首次发布。它是用 Python 编写的,并使用docker-compose
.通常,Compose V1 项目在 compose.yml 文件中包含一个顶级 version 元素,其值范围为 2.0 到 3.8,指的是特定的文件格式。
Docker Compose 命令行Binaries的第二个版本于 2020 年宣布,用 Go 编写,并使用docker compose
.Compose V2 会忽略 compose.yml 文件中的 version 顶级元素。
有关详细信息,请参阅 Compose 的历史和发展。
两者之间有什么区别up
,run
和start
?
通常,您希望docker compose up
.用up
启动或重新启动所有
在compose.yml
.在默认的 “attached”
模式中,您可以看到来自所有容器的所有日志。在 “detached” 模式下 (-d
),
Compose 在启动容器后退出,但容器继续运行
在后台。
这docker compose run
命令用于运行 “one-off” 或 “adhoc” 任务。它
需要要运行的服务名称,并且仅启动服务的容器
正在运行的服务所依赖的。用run
运行测试或执行
管理任务,例如删除数据或将数据添加到数据卷
容器。这run
命令的作用类似于docker run -ti
因为它会打开一个
interactive 终端添加到容器中,并返回与
容器中进程的退出状态。
这docker compose start
命令仅用于重启容器
之前创建但已停止的它永远不会创建新的
器皿。
为什么我的服务需要 10 秒才能重新创建或停止?
这docker compose stop
命令尝试通过发送SIGTERM
.然后它等待
默认超时为 10 秒。超时后,
一个SIGKILL
被发送到容器以强制杀死它。如果你
正在等待此超时,这意味着您的容器不会关闭
当他们收到SIGTERM
信号。
已经有很多关于进程在容器中处理信号的文章。
要解决此问题,请尝试以下作:
确保您使用的是 exec 形式的
CMD
和ENTRYPOINT
在 Dockerfile 中。例如,使用
["program", "arg1", "arg2"]
不"program arg1 arg2"
. 使用字符串形式会导致 Docker 使用bash
哪 无法正确处理信号。Compose 始终使用 JSON 格式,因此不要使用 担心您是否覆盖了 Compose 文件中的 command 或 entrypoint。如果可以,请修改您正在运行的应用程序 为
SIGTERM
.将
stop_signal
发送到应用程序知道如何处理的信号:services: web: build: . stop_signal: SIGINT
如果您无法修改应用程序,请将应用程序包装在轻量级 init 中 系统(如 S6)或信号代理(如 dumb-init 或 tini)。这些包装器中的任何一个都会处理 处理
SIGTERM
适当地。
如何在同一主机上运行 Compose 文件的多个副本?
Compose 使用项目名称为所有
项目的容器和其他资源。要运行项目的多个副本,
使用-p
命令行选项
或COMPOSE_PROJECT_NAME
环境变量.
我可以为我的 Compose 文件使用 JSON 而不是 YAML 吗?
是的。YAML 是 JSON 的超集,因此 任何 JSON 文件都应为有效的 YAML。如需在 Compose 中使用 JSON 文件,请执行以下作: 指定要使用的文件名,例如:
$ docker compose -f docker-compose.json up
我应该将我的代码包含在COPY
/ADD
还是卷?
您可以使用COPY
或ADD
指令中Dockerfile
.如果您需要重新定位代码以及
Docker 镜像,例如当您将代码发送到另一个环境时
(生产、CI 等)。
使用volume
如果要更改代码并查看它们
立即反映出来,例如,当您开发代码和服务器时
支持热代码重载或实时重载。
在某些情况下,您可能希望同时使用两者。您可以拥有镜像
使用COPY
,并使用volume
在 Compose 文件中设置为
在开发过程中包含来自主机的代码。卷覆盖
镜像的目录内容。