Compose 常见问题解答

docker composedocker-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 的历史和发展

uprunstart 之间有什么区别?

通常,您希望 .用于启动或重新启动所有 在 .在默认的 “attached” 模式中,您可以看到来自所有容器的所有日志。在 “detached” 模式 () 下, Compose 在启动容器后退出,但容器继续运行 在后台。docker compose upupcompose.yml-d

该命令用于运行 “one-off” 或 “adhoc” 任务。它 需要要运行的服务名称,并且仅启动服务的容器 正在运行的服务所依赖的。用于运行测试或执行 管理任务,例如删除数据或将数据添加到数据卷 容器。该命令的作用类似于它打开 interactive 终端添加到容器中,并返回与 容器中进程的退出状态。docker compose runrunrundocker run -ti

该命令仅用于重启容器 之前创建但已停止的它永远不会创建新的 器皿。docker compose start

为什么我的服务需要 10 秒才能重新创建或停止?

该命令尝试通过发送 .然后它等待 默认超时为 10 秒。超时后, a 被发送到容器以强制杀死它。如果你 正在等待此超时,这意味着您的容器不会关闭 当他们收到信号时。docker compose stopSIGTERMSIGKILLSIGTERM

已经有很多关于进程在容器中处理信号的文章。

要解决此问题,请尝试以下操作:

  • 确保您在 Dockerfile 中使用 和 的 exec 形式。CMDENTRYPOINT

    例如,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-inittini)。这些包装器中的任何一个都会处理 妥善处理。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 等)。COPYADDDockerfile

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

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