迁移到Compose V2
从2023年7月起,Compose V1 停止接收更新。它也不再在新版本的 Docker Desktop 中提供。
Compose V2,首次发布于2020年,包含在所有当前支持的Docker Desktop版本中。它提供了改进的CLI体验,使用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 Engine的调试日志记录,并确保连接使用TLS。
提示
更新脚本以使用Compose V2,通过将连字符(
-)替换为空格,使用docker compose而不是docker-compose。
服务容器名称
Compose 根据项目名称、服务名称和规模/副本计数生成容器名称。
在Compose V1中,下划线(_)被用作单词分隔符。
在Compose V2中,连字符(-)被用作单词分隔符。
下划线在DNS主机名中不是有效字符。 通过使用连字符代替,Compose V2确保服务容器可以通过一致、可预测的主机名在网络上访问。
例如,运行Compose命令-p myproject up --scale=1 svc会生成一个名为myproject_svc_1的容器(使用Compose V1)和一个名为myproject-svc-1的容器(使用Compose V2)。
提示
在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 | Deprecated. Migrates YAML fields based on legacy schema version. | Uses _ as word separator for container names instead of - to match V1. |
ps --filter KEY-VALUE | Undocumented. Allows filtering by arbitrary service properties. | Only allows filtering by specific properties, e.g. --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/compose-bin 镜像在 Docker Hub 上 打包了最新版本的 Compose V2,用于多阶段构建。
如果我想的话,我还能使用Compose V1吗?
是的。您仍然可以下载并安装Compose V1包,但如果出现问题,您将无法获得Docker的支持。
警告
Compose V1 的最终版本 1.29.2 发布于 2021 年 5 月 10 日。自那时起,这些包未收到任何安全更新。使用风险自负。