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 V1 | Compose V2 | |
|---|---|---|
--compatibility | 已弃用。根据旧版架构版本迁移 YAML 字段。 | 使用 _ 作为容器名称的分隔符,而非 -,以与 V1 版本保持一致。 |
ps --filter KEY-VALUE | 未记录。允许按任意服务属性进行过滤。 | 仅允许按特定属性进行过滤,例如 --filter=status=running。 |
环境变量
Compose V1 中的环境变量行为未正式记录,且在某些边缘情况下表现不一致。
对于 Compose V2,
环境变量部分涵盖了
优先级以及
.env文件插值,并包含许多示例,涵盖诸如转义嵌套引号等复杂情况。
检查是否:
- 您的项目使用了多层环境变量覆盖,例如
.env文件和--envCLI 标志。 - 任何
.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 日。自那时起,这些软件包未再收到任何安全更新。使用风险自负。