Docker Compose 的 include 指令(v2.21.0+)用于组合多个完整 compose 项目文件,非内联配置复用;需引用有效 YAML 文件、路径相对、服务名不重复、网络/卷需显式命名共享。

Docker Compose 的 include 指令在 v2.21.0+ 版本中引入,但需注意:它不是传统意义上的“配置复用”或“模板包含”,而是用于组合多个独立的 compose 项目(即多个 docker-compose.yml 文件)为一个逻辑运行单元。它不支持像 env_file 或 extends 那样内联加载片段,也不能在单个文件里用 include: 去引用 YAML 片段(如 services 子集)。因此,“模块化编排”需围绕 include 的实际能力来设计。
✅ 正确理解 include 的作用范围
`include` 只能引用其他完整的、可独立运行的 compose 项目文件(即含 version、services 等顶层字段的 .yml),且被包含的文件必须满足:
- 是有效的 Compose v2.21+ 格式(推荐
version: "3.8"或更高,但实际解析由 Compose CLI 控制) - 路径为相对路径(相对于当前 compose 文件所在目录)
- 不能包含重复的服务名(否则启动失败)
- 被包含项目中的
networks、volumes等资源默认隔离,需显式声明name:并在主项目中复用才能互通
✅ 实现模块化:按功能拆分 compose 项目
例如将一个 Web 应用拆为:db.yml(数据库)、cache.yml(Redis)、app.yml(后端服务),再用主文件统一编排:
? 项目结构:
./docker-compose.yml ← 主入口,仅含 include ./db.yml ← 模块1:PostgreSQL ./cache.yml ← 模块2:Redis ./app.yml ← 模块3:应用服务
./docker-compose.yml:
include: - db.yml - cache.yml - app.yml
./db.yml 示例:
services:
db:
image: postgres:15
environment:
POSTGRES_DB: myapp
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
⚠️ 注意:此时 db 服务在 docker-compose.yml 上下文中可见,但默认网络隔离 —— 若 app.yml 中的 service 要连 db,需确保两者共用同一 network:
- 在
db.yml和app.yml中都定义同名 network(如backend),并指定name: - 或在主文件中定义 network,并通过
include后在各模块 service 中显式networks: [backend]
✅ 复用配置:配合 profiles 和 env_file 提升灵活性
include 支持条件加载(基于 profile)和环境变量注入,适合多环境模块化:
- 用
profiles:控制模块是否生效(如只在dev加载 mock 服务) - 各模块可自带
env_file:,避免主文件堆积环境变量 - 主文件可通过
environment:或.env统一传递变量给所有被包含项目
示例:mock-api.yml 仅开发时启用:
services:
mock-server:
image: wiremock/wiremock
ports: ["8080:8080"]
profiles: ["dev"]
启动时加 --profile dev 即可激活该模块。
✅ 替代方案:当 include 不适用时的模块化思路
若你真正需要的是“在单个文件中复用 service 定义”(比如多个 app 共享同一 Redis 配置),include 不是答案。此时应考虑:
- YAML 锚点(anchors)与别名(aliases):适用于同一文件内复用(如多个 service 共享相同 healthcheck)
- 使用 docker-compose config --resolve-image-digests 预处理生成最终配置(配合工具如 yq、envsubst)
-
拆分为多个 compose 项目 + 自定义脚本启动(如用 Makefile 或 shell 调用多次
docker-compose -f xxx.yml up)
官方明确表示:Compose 不提供类似 Helm 或 Kustomize 的模板化能力;include 是项目组合机制,不是配置抽象层。


















