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