从 Docker Compose v1 迁移到 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 访问。
对于 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,在 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 日发布。此后这些软件包未收到任何安全更新。使用风险自负。