Docker Compose多环境部署依赖配置文件叠加顺序与环境变量六层优先级协同控制:以docker-compose.yml为基础,叠加docker-compose.{env}.yml实现分层覆盖,后加载文件同名字段优先;环境变量按service内environment>shell导出>env_file>默认值>.env>系统变量顺序生效,确保开发→测试→生产逐级可控覆盖。

要让 Docker Compose 在多阶段部署中正确处理环境变量覆盖,关键不是“阶段”本身(Compose 没有 build 阶段那样的原生部署阶段概念),而是靠配置文件叠加顺序 + 变量来源优先级两层机制协同控制。实际是通过多个 YAML 文件定义不同环境的配置,并结合环境变量注入时机实现“开发→测试→生产”的逐级覆盖。
用多文件覆盖实现环境分层
基础结构推荐如下:
-
docker-compose.yml:只放通用字段,比如服务名、镜像名(不含 tag)、网络定义、基础卷声明;不写 environment 或只写占位符如
DATABASE_URL: ${DB_URL} -
docker-compose.dev.yml:覆盖开发专属项,例如挂载源码、启用调试端口、设置
environment: [ENV=dev] -
docker-compose.prod.yml:覆盖生产必需项,如真实数据库地址、资源限制、健康检查;可显式定义
environment: [ENV=prod, DB_HOST=pg-prod]
启动命令决定覆盖顺序:docker compose -f docker-compose.yml -f docker-compose.prod.yml up
后加载的 prod.yml 中同名字段会覆盖 yml 中的定义,包括 environment 字段里的键值对(深度合并)。
环境变量六层优先级必须理清
即使在同一个服务定义里,变量也可能来自多个地方,最终生效值由优先级决定。从高到低依次为:
- 服务内
environment:显式写的值(如- API_KEY=live-key)——最高,不可被其他方式覆盖 - Shell 启动时导出的变量(
export API_KEY=shell-value) - 服务中
env_file:指定的文件(如- prod.env),多个文件按书写顺序加载,后读取的同名键覆盖前一个 - 服务定义中未显式覆盖的默认值(如
API_KEY: default-key) - 项目根目录下的
.env文件(自动加载,用于提供全局默认) - 系统级环境变量(最低,一般不依赖)
举例:若 .env 写 DB_PORT=5432,prod.env 写 DB_PORT=6432,而服务又写了 environment: - DB_PORT=7432,容器内最终值就是 7432。
变量注入与安全配合建议
避免硬编码敏感信息,推荐组合使用:
- 把非敏感通用配置放
.env(如APP_NAME=myapp),它会被所有环境自动继承 - 把环境专属但非机密的配置放对应
docker-compose.{env}.yml的environment:下 - 把密码、密钥等敏感数据单独写进
prod.secrets.env并加入.gitignore,再通过env_file:引入 - 必要时用 shell 命令动态传参:
docker compose --env-file prod.secrets.env up,此时命令行传入的--env-file优先级高于 YAML 中的env_file
这样既满足不同部署阶段的差异化需求,又守住变量覆盖的确定性边界。











