Docker Compose多文件合并标准做法是用-f参数按序指定YAML文件,左侧为基础配置,右侧优先级更高并覆盖同名字段;默认自动加载docker-compose.yml与docker-compose.override.yml,自定义文件需显式声明;image、command等标量值完全覆盖,environment深度合并,ports、volumes追加,deploy.resources等整块替换。

直接用 -f 参数指定多个 YAML 文件,按顺序加载并自动合并——这是 Docker Compose 多文件组合部署的标准做法。
基础命令写法
最常用的方式是显式指定文件顺序:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -ddocker compose -f docker-compose.base.yml -f docker-compose.dev.yml up
第一个文件(左起)作为基础配置,后续文件依次叠加,右侧文件优先级更高,同名字段以它为准。
文件命名与默认行为
Docker Compose 有约定俗成的默认加载逻辑:
- 若不加
-f,默认只读docker-compose.yml - 如果同时存在
docker-compose.override.yml,且未显式指定-f,Compose 会自动把它和docker-compose.yml合并(相当于隐式-f docker-compose.yml -f docker-compose.override.yml) - 自定义文件名(如
.prod.yml)必须用-f显式声明,不会被自动识别
关键配置项的合并规则
不同字段合并方式不同,不能一概而论:
- image、command、restart:标量值,完全覆盖(后一个文件值生效)
- environment:键值对深度合并,同名变量被替换,其余保留
- ports、volumes、depends_on:列表追加,所有条目都有效
- deploy.resources、healthcheck:整个块被替换,不是逐字段合并
例如:docker-compose.yml 定义了 ports: ["8080"],dev.yml 加了 ports: ["5000"],最终两个端口都会暴露。
路径和变量引用注意事项
所有相对路径(如 build.context、volumes 中的本地路径)都以第一个 -f 指定的文件所在目录为基准,不是当前工作目录。
环境变量仍可注入,且优先级高于 YAML 中的静态值。比如 docker compose -f base.yml -f prod.yml --env-file .prod.env up,.prod.env 里的变量会覆盖 YAML 中同名 environment 设置。


















