Migrate to Compose V2

自 2023 年 7 月起,Compose V1 已停止接收更新。它也不再包含在 Docker Desktop 的新版本中。

Compose V2 于 2020 年首次发布,已包含在所有当前受支持的 Docker Desktop 版本中。它提供了更优化的命令行体验、借助 BuildKit 提升的构建性能,以及持续的新功能开发。

我如何切换到 Compose V2?

最简单且推荐的方法是确保您拥有最新版本的 Docker Desktop,它捆绑了 Docker Engine 和 Docker CLI 平台(包括 Compose V2)。

使用 Docker Desktop 时,Compose V2 始终可作为 docker compose 访问。 此外,使用 Compose V2 设置默认已启用,这提供了从 docker-compose 的别名。

对于 Linux 上的手动安装,您可以通过以下方式获取 Compose V2:

Compose V1 和 Compose V2 之间有哪些区别?

docker-compose vs docker compose

与 Compose V1 不同,Compose V2 已集成到 Docker CLI 平台中,推荐的命令行语法是 docker compose

Docker CLI 平台提供了一致且可预测的选项和标志,例如 DOCKER_HOST 环境变量或 --context 命令行标志。

此更改允许您在根 docker 命令上使用所有共享标志。 例如,docker --log-level=debug --tls compose up 可启用 Docker 引擎的调试日志记录,并确保连接使用 TLS。

提示

更新脚本以使用 Compose V2,方法是将连字符 (-) 替换为空格,并使用 docker compose 代替 docker-compose

服务容器名称

Compose 根据项目名称、服务名称以及规模/副本数量生成容器名称。

在 Compose V1 中,下划线 (_) 被用作单词分隔符。 在 Compose V2 中,连字符 (-) 被用作单词分隔符。

下划线不是 DNS 主机名中的有效字符。 通过使用连字符,Compose V2 确保服务容器可以通过一致且可预测的主机名在网络中被访问。

例如,运行 Compose 命令 -p myproject up --scale=1 svc 会在 Compose V1 中生成一个名为 myproject_svc_1 的容器,而在 Compose V2 中生成一个名为 myproject-svc-1 的容器。

提示

在 Compose V2 中,全局 --compatibility 标志或 COMPOSE_COMPATIBILITY 环境变量可保留 Compose V1 的行为,即使用下划线(_)作为单词分隔符。 由于此选项必须在每次运行 Compose V2 命令时指定,因此建议您仅在迁移到 Compose V2 的过程中将其作为临时措施使用。

命令行标志和子命令

Compose V2 支持几乎所有 Compose V1 的标志和子命令,因此在大多数情况下,它可以在脚本中作为直接替代品使用。

在 V2 中不受支持

以下内容在 Compose V1 中已被弃用,且在 Compose V2 中不再支持:

  • docker-compose scale. 请使用 docker compose up --scale 替代。
  • docker-compose rm --all

V2 中的不同之处

以下内容在 Compose V1 和 V2 之间表现不同:

Compose V1Compose V2
--compatibility已弃用。根据旧版架构版本迁移 YAML 字段。使用 _ 作为容器名称的分隔符,而非 -,以与 V1 版本保持一致。
ps --filter KEY-VALUE未记录。允许按任意服务属性进行过滤。仅允许按特定属性进行过滤,例如 --filter=status=running

环境变量

Compose V1 中的环境变量行为未正式记录,且在某些边缘情况下表现不一致。

对于 Compose V2, 环境变量部分涵盖了 优先级以及 .env文件插值,并包含许多示例,涵盖诸如转义嵌套引号等复杂情况。

检查是否:

  • 您的项目使用了多层环境变量覆盖,例如 .env 文件和 --env CLI 标志。
  • 任何 .env 文件值都包含转义序列或嵌套引号。
  • 任何 .env 文件值都包含字面量 $ 符号。这在 PHP 项目中很常见。
  • 任何变量值都使用高级扩展语法,例如 ${VAR:?error}

提示

在项目中运行 docker compose config,以预览 Compose V2 执行插值后的配置, 验证值是否符合预期。

通常,通过确保字面值(无插值)使用单引号,而需要应用插值的值使用双引号,即可实现与 Compose V1 的向后兼容性。

这对使用 Compose V1 的项目意味着什么?

对于大多数项目,切换到 Compose V2 无需更改 Compose YAML 文件或开发工作流程。

建议您适应运行 Compose V2 的新推荐方式,即使用 docker compose 而非 docker-compose。 这提供了额外的灵活性,并移除了对 docker-compose 兼容性别名的需求。

然而,Docker Desktop 继续支持 docker-compose 别名,以便将命令重定向到 docker compose,从而提供便利并提高与第三方工具和脚本的兼容性。

在切换之前,我还需要了解其他内容吗?

迁移正在运行的项目

在 V1 和 V2 中,对 Compose 项目运行 up 会根据 Docker Engine 中的实际状态与已解析的项目配置(包括 Compose YAML、环境变量和命令行标志)进行比较,按需重新创建服务容器以达到期望状态。

由于 Compose V1 和 V2 对服务容器的命名方式不同,在原本由 V1 启动并正在运行服务的项目中,首次使用 V2 运行 up 时,会导致服务容器被重新创建并更新名称。

请注意,即使使用了 --compatibility 标志来保留 V1 的命名风格,Compose 仍需要在首次由 V2 运行 up 时重新创建最初由 V1 启动的服务容器,以迁移内部状态。

在 Docker-in-Docker 中使用 Compose V2

Compose V2 现已包含在 Docker Hub 上的 Docker 官方镜像中。

此外,Docker Hub 上新的 docker/compose-bin 镜像 打包了最新版本的 Compose V2,可用于多阶段构建。

如果我想的话,我仍然可以使用 Compose V1 吗?

是的。您仍然可以下载并安装 Compose V1 包,但如果出现任何问题,Docker 将不提供支持。

警告

Compose V1 的最终版本(1.29.2)发布于 2021 年 5 月 10 日。自那时起,这些软件包未再收到任何安全更新。使用风险自负。

其他资源