Skip to content

docker-compose版本解析

问题描述

在使用docker-compose.yml文件时,开发者经常在第一行看到类似这样的版本声明:

yaml
version: '3.9'

当你检查系统安装的Docker Compose版本时,可能输出如下:

bash
$ docker-compose --version
Docker Compose version v2.17.2

这引发了困惑:为什么命令行工具显示v2.17.2,而文件中却指定3.9?两者之间有何关系?本文将揭示版本声明的真正含义和历史背景。

ℹ️ 核心区别

  • docker-compose --version 显示的是 工具的运行版本
  • version: 指定的是 文件格式版本

解决方案详解

历史背景与版本差异

Docker Compose有两种不同的实现,文件格式也经历了多个版本迭代:

文件格式版本version:支持功能Python ComposePlugin Compose
1未指定前Docker网络时代
22 - 2.4单机Docker部署
33 - 3.8Docker Swarm支持
规范格式任意值(被忽略)仅Plugin Compose

关键日期

  • 2023年6月:官方停止支持Python版本的docker-compose
  • 2023年起:多数系统使用Go编写的docker compose(Plugin版本)

当前最佳实践

  1. 现代方案(推荐)

    yaml
    # 直接省略version声明
    services:
      web:
        image: nginx:latest
    • 当使用Plugin Compose(v2+)时,version:已被弃用
    • 工具自动按最新规范解析文件
    • 在配置文件中保留version:会触发警告:
      WARN[0000] /docker-compose.yml: `version` is obsolete
  2. 兼容方案(旧项目)

    yaml
    version: '3.8'  # 最后被双方支持的版本
    services:
      db:
        image: postgres:13
    • 若需支持Python版Compose,使用3.8
    • 资源限制需求时可选2.4

版本规则说明

  • 不存在3.9版本
    文件格式最高只到3.8,当您指定3.9时:

    • Python版Compose会报错
    • Plugin版Compose会忽略该值并按新规范解析
  • 新特性用法
    需特定Compose工具版本的功能时:

    yaml
    version: '4.0+compose-2.20'  # 要求Compose v2.20+

核心差异解析

  • 工具版本:决定运行时功能
  • 文件格式:决定配置语法规则
  • 二者独立:新版工具可解析旧版格式文件

迁移建议

  1. 检查当前环境:

    bash
    docker compose version  # 确认是否为v2+
  2. 按以下步骤迁移:

    bash
    # 1. 移除文件中的version行
    sed -i '/^version:/d' docker-compose.yml
    
    # 2. 运行验证
    docker compose config  # 检查配置是否合法
  3. 如遇旧语法告警:

    bash
    WARN[0000] 'cpu_quota' is deprecated  # 需更新为新版参数

    参考Compose规范文档更新语法

结论

  • 新项目不需要也不应该包含version:声明
  • 维护旧项目时:
    • Python Compose环境 ➝ 用version: '3.8'
    • Plugin Compose环境 ➝ 删除version:并更新语法
  • 两类版本声明(工具版本/文件格式)已解耦
    理解其差异能避免配置混淆

⚠️ 2023年后官方只维护Plugin Compose
建议所有环境使用docker compose v2+
并移除过时的version:声明获得最完整的兼容性