多文件合并是什么
Compose 支持把多个编排文件叠加成一份最终配置:默认会自动加载同目录下的覆盖文件,也可以用多个 -f 参数显式指定组合顺序。合并规则按字段类型区分:标量字段后者覆盖前者,列表与映射类字段按规则叠加或合并。这样就能让基础文件描述公共结构,环境文件只写差异,避免维护多份高度重复的配置。
基本信息
| 自动叠加 | compose.yaml(或 docker-compose.yml)加 docker-compose.override.yml |
|---|---|
| 显式组合 | docker compose -f base.yml -f prod.yml up -d |
| 合并方向 | 靠后的文件优先级更高 |
| 标量字段 | 直接覆盖 |
| 序列与映射 | 按规则合并,不是简单替换 |
| 查看结果 | docker compose config 渲染最终配置 |
| 环境变量方式 | COMPOSE_FILE 用分隔符指定文件列表(Windows 与 Linux 分隔符不同) |
典型使用场景
- 基础文件描述服务结构,生产文件只改镜像标签与资源限制
- 开发本地加挂载源码目录与调试端口,不改动基础文件
- 多环境发布:测试、预发、生产各写一份差异文件
- 临时演练:用一份附加文件把副本从三份改成一份
- 排查配置未生效:先渲染最终配置再判断是文件顺序还是字段合并问题
叠加与核对
叠加与核对
# 显式组合两个文件并渲染最终配置(输出不会改动任何运行中的服务)
docker compose -f compose.yaml -f compose.prod.yaml config > /tmp/merged.yml
head -40 /tmp/merged.yml
# 按组合结果启动
docker compose -f compose.yaml -f compose.prod.yaml up -d
# 用环境变量固定文件组合(Linux 冒号分隔,Windows 分号分隔)
COMPOSE_FILE='compose.yaml:compose.prod.yaml' docker compose up -d
# 查看当前项目实际生效的服务与文件
docker compose config --services覆盖文件示例
覆盖文件示例
# compose.prod.yaml:只写与基础文件的差异
services:
api:
image: app/api:1.4.3 # 覆盖基础文件里的标签
deploy:
resources:
limits:
memory: 1g # 叠加资源限制
environment:
LOG_LEVEL: warn # 映射类字段按合并规则处理合并规则怎么读
| 字段类型 | 合并行为 | 实践建议 |
|---|---|---|
| 单个值(镜像标签、端口映射等) | 后者覆盖前者 | 差异写在后面文件里 |
| 列表(端口、命令参数等) | 按规则合并或替换 | 改动后用 config 核对 |
| 映射(environment、labels) | 键级合并 | 只写需要改的键 |
| 整个服务 | 同名服务按字段合并 | 避免在两个文件里重复定义 |
默认自动加载的覆盖文件在部署机上同样生效:服务器目录里如果留着为开发准备的覆盖文件,会导致生产环境多挂载目录或暴露端口,部署时应把这些文件排除。
不确定合并结果时不要靠猜:config 渲染出的是引擎真正看到的那份配置,一行行核对比读合并规则快得多。