docker-compose声明版本为3.0时实际使用哪个文件规范解析?
Compose文件实际生效规范版本说明
核心结论
你当前场景下,docker-compose并没有严格按照声明的version: "3.0"标准规范解析配置,实际加载的是工具自身支持的全量兼容特性集——既包含v3规范的配置项,也保留了v2版本的depends_on.condition这类遗留特性,属于跨版本兼容的非严格解析模式。
原因说明
- 通常所说的「Compose v3规范不支持
depends_on下的condition配置」,是面向Docker Swarm集群编排的标准限制:Swarm本身的调度逻辑不支持按依赖服务的健康状态阻塞启动服务,因此用于Swarm部署的v3规范移除了这个配置项。 - 你使用的1.29.2是最后一代Python实现的独立docker-compose工具,从1.27.0版本开始,这个工具就不再严格按照文件顶部声明的version值做语法拦截:只要是工具本身支持的配置项,不管属于v2还是v3版本范畴,都会被正常解析加载。
- 执行
docker-compose config输出的version: '3.0'只是原样回显你在配置文件里填写的字段值,不代表工具真的按照3.0版本的规范做了严格校验。 - 后续Go语言重写的Compose V2(Docker CLI内置的compose插件)进一步弱化了version字段的作用,现在最新的Compose规范已经不需要顶层声明version字段,所有工具支持的特性都可以直接使用,不再和版本号绑定。
判断实际解析规则的方法
没有命令可以直接输出当前使用的规范版本号,可以通过两个维度判断:
- 看部署执行的命令:如果用
docker stack deploy将配置部署到Swarm集群,就会严格遵循声明的v3规范校验,存在condition配置时会直接报错;如果用docker-compose up/docker-compose config这类独立Compose命令,在1.27+版本的Compose工具下都会自动兼容跨版本特性,不会拦截condition这类配置。 - 做特性校验测试:可以在配置里加入更高版本才支持的特性,比如v3.8才支持的
deploy.max_replicas_per_node配置,如果文件头部声明version: "3.0"时执行docker-compose config依然不报错,就能确认工具没有严格按照声明的版本做解析。
问题场景示例配置
version: "3.0" services: db: image: docker.feedzai.com/hub-proxy/library/postgres:11 healthcheck: test: ["CMD-SHELL", "pg_isready"] interval: 10s timeout: 5s retries: 5 app: image: docker.feedzai.com/hub-proxy/library/postgres:11 healthcheck: test: ["CMD-SHELL", "app_isready"] interval: 10s timeout: 5s retries: 5 depends_on: db: condition: service_healthy
复现过程
# 启动Ubuntu Jammy测试容器 docker run --rm -it --entrypoint /bin/bash ubuntu:jammy-20220531 # 容器内安装1.29.2版本docker-compose apt-get update && apt-get install docker-compose docker-compose -v # 版本输出:docker-compose version 1.29.2, build unknown # 将上述Compose文件拷贝进容器后执行配置校验 docker-compose config # 校验正常通过,输出保留depends_on的condition配置,同时回显version: '3.0'
内容的提问来源于stack exchange,提问作者Roberto Morávia
相关产品推荐
相关产品推荐

