Compose V2 入门
- 自 2023 年 7 月起,Compose V1 将停止接收更新。它也不再在 Docker Desktop 的新版本中提供。
- Compose V2 于 2020 年首次发布,包含在所有当前支持的 Docker Desktop 版本中。它提供了改进的 CLI 体验、改进的 BuildKit 构建性能以及持续的新功能开发。
- 最简单且最推荐的方法是确保您拥有最新版本的 Docker Desktop,它捆绑了 Docker Engine 和 Docker CLI 平台(包括 Compose V2)。
- 在 Docker Desktop 中,Compose V2 总是可以通过
docker compose
访问。此外,默认情况下开启了“使用 Compose V2”设置,这为docker-compose
提供了一个别名。 - 对于在 Linux 上手动安装,您可以通过以下方式获取 Compose V2:
-
docker-compose
对比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。 - 通过用空格替换连字符(
-
),将docker-compose
改为docker compose
来更新脚本以使用 Compose V2。
- 与 Compose V1 不同,Compose V2 集成到 Docker CLI 平台,推荐的命令行语法是
-
服务容器名称
- 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
文件和--env
命令行标志。 - 任何
.env
文件中的值是否包含转义序列或嵌套引号。 - 任何
.env
文件中的值是否包含字面意义的$
符号。这在 PHP 项目中很常见。 - 任何变量值是否使用了高级扩展语法,例如
${VAR:?error}
。
- 你的项目是否使用了多层环境变量覆盖,例如
- 在项目上运行
docker compose config
,以在 Compose V2 执行插值后预览配置,并验证值是否符合预期。 - 通常,通过确保字面值(不需要插值)使用单引号,而需要进行插值的值使用双引号,可以实现与 Compose V1 的向后兼容性。
- 对于大多数项目,切换到 Compose V2 不需要对 Compose YAML 或开发工作流程进行更改。
- 建议你适应使用 Compose V2 的新方式,即使用
docker compose
而不是docker-compose
。这提供了更多的灵活性,并且不再需要使用docker-compose
的兼容性别名。 - 然而,Docker Desktop 仍然支持
docker-compose
别名,将命令重定向到docker compose
,以方便使用并提高与第三方工具和脚本的兼容性。