Compose 常见问题解答

两者之间有什么区别docker composedocker-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,runstart?

通常,您希望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 形式的CMDENTRYPOINT在 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-inittini)。这些包装器中的任何一个都会处理 处理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还是卷?

您可以使用COPYADD指令中Dockerfile.如果您需要重新定位代码以及 Docker 镜像,例如当您将代码发送到另一个环境时 (生产、CI 等)。

使用volume如果要更改代码并查看它们 立即反映出来,例如,当您开发代码和服务器时 支持热代码重载或实时重载。

在某些情况下,您可能希望同时使用两者。您可以拥有镜像 使用COPY,并使用volume在 Compose 文件中设置为 在开发过程中包含来自主机的代码。卷覆盖 镜像的目录内容。