DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

Docker Compose 报 Additional property include is not allowed

Docker Compose 顶层 include 报不允许时,核对实际插件版本与执行入口,区分文件 version 字段,并用配置校验检查引入文件、路径及资源名称。

在 compose.yaml 顶层加入 include 后,运行构建或启动命令,配置校验就停在:

(root) Additional property include is not allowed

如果实际运行的 Docker Compose 低于 2.20.0,应先处理版本不支持的问题。顶层 include 从 Compose 2.20.0 开始提供;Docker Engine 已经是 24.x,也不能说明配套的 Compose 已经支持它。

这个错误发生在配置解析阶段。修改镜像、重建容器或清理数据卷,不能让旧解析器识别新字段。应先确认报错位置和执行工具,再用只校验配置的命令验证。

三个版本号不要混着看

在原来报错的终端或 CI 执行环境中运行:

docker compose version

如果脚本实际调用的是带连字符的命令,也要单独查看:

docker-compose version

这两个入口可能指向不同安装,也可能最终使用同一个实现。不能仅凭命令中有没有空格判断功能是否可用,应以实际版本输出为准。

看到的位置 它说明什么
docker --version 或 Engine 版本 Docker CLI 或引擎版本,不能代替 Compose 版本
docker compose version 当前命令实际使用的 Compose 版本
YAML 中的 version: '3.8' 旧文件格式标记,不是已安装 Compose 的版本

在当前 Compose Specification 中,顶层 version 已经是兼容性字段,不能用它选择一个尚未安装的新解析器。因此,把 3.8 改成 3.9,或者删除这行,都不能给 Compose 2.18.1 增加 include 支持。

如果报错来自桌面软件、部署面板或流水线,还应确认那个执行环境中的 Compose。只升级个人电脑上的插件,不会同步升级远程执行器。

升级负责解析文件的 Compose

使用原安装渠道提供的维护版本,并确认包含 include 支持。2.20.0 是该功能的最低版本,不是今天必须安装的目标版本;文件中若还用了其他较新的字段,它们可能有更高的要求。

Docker Desktop 自带 Compose,通常随 Desktop 一起维护;Linux 上单独安装的 Compose 插件则按原来的包管理或手动安装方式更新。由其他桌面发行版捆绑的组件,应按该发行版的管理方式更新。不要为了抢占命令路径,把多套来源不明的二进制复制到不同目录。

升级后重新打开报错终端,再次查看实际版本。自动化任务也要在它自己的运行环境中检查。保留旧安装信息和原始配置,以便遇到平台兼容问题时恢复;回退到不支持 include 的工具后,也必须使用与之兼容的配置。

用两个小文件确认 include 能否解析

下面只用于配置校验。目录结构为:

project/
├── compose.yaml
└── common/
    ├── compose.yaml
    └── data/

主文件 project/compose.yaml:

include:
  - ./common/compose.yaml

services:
  app:
    image: example/app:local

被包含的 project/common/compose.yaml:

services:
  worker:
    image: example/worker:local
    volumes:
      - ./data:/data

两个镜像名都是占位值,这个示例不要求构建或拉取它们,也不要直接拿它启动业务。在 project 目录中校验:

docker compose -f compose.yaml config -q
docker compose -f compose.yaml config --services

第一条只校验配置,成功时不打印展开结果;仍需确认退出状态为成功。第二条应列出 app 和 worker,顺序不作为判断条件。如果仍报顶层 include 不允许,回到实际执行的版本与入口检查,而不是继续调整容器参数。

include 与 services 必须同为顶层字段。把它缩进到某个服务下面,是不同的结构问题;错误路径若是 services.app 而非 (root),就不应只按低版本处理。路径拼错、被包含文件缺失,也要根据升级后出现的实际错误另行修正。

校验通过后,还要核对展开路径

用实际项目的原有 -f 参数、环境文件和项目名查看展开结果:

docker compose -f compose.yaml config

这里只展示单主文件示例。真实部署若有其他参数,核对时也要保留,避免校验了另一套配置。展开结果可能包含已替换的环境变量值,应在本机查看,不要把含凭据的输出直接发到公开渠道。

默认情况下,被 include 引入的文件按自己的所在目录解析相对路径。上述 worker 的 ./data 因此对应 project/common/data。如果使用长语法显式设置了 project_directory,则以该设置为准。

还要核对服务、卷和网络是否与主文件中的资源重名。include 不会像覆盖文件那样自动把同名资源合并成你想要的配置。服务列表完整、路径正确、资源名称无意外冲突后,再进入原有部署流程。配置校验成功不证明镜像存在、端口可用,也不证明应用能正常启动。

暂时不能升级时,不能只把 include 换成 -f

多个 -f 参数走的是合并规则,后面的文件可以覆盖或扩展前面的定义;相对路径默认统一以第一个文件为基准。include 则将文件按各自项目目录加载后引入,两者并不等价。

例如要把前面的文件改成旧工具可解析的合并形式,需要先另存兼容稿:主文件移除 include,子文件中的 ./data 改成相对主文件的 ./common/data。然后用对应的两个兼容稿校验,不能让旧工具继续读取原来的顶层 include。

这只是最简单的路径示例。真实项目还可能有构建目录、服务环境文件、绑定挂载和同名资源合并问题,应逐项对照展开结果;不要直接批量替换后部署。保留原稿,兼容稿校验失败时恢复文件即可,无需删容器或数据卷。

如果实际执行的是 docker stack deploy,本文的 Compose 插件升级路径也不能直接套用。Stack 部署使用旧的 Compose v3 文件格式,并不等同于当前 Compose Specification;应为该部署入口准备受支持的配置,而不是把 include 的最低 Compose 版本当作 Stack 的支持承诺。