docker compose环境变量优先级从高到低为:environment字段 > 宿主机shell变量 > env_file文件 > .env文件;支持多文件叠加和变量默认值(如${db_port:-5432}),结合docker-compose.yml基础配置与docker-compose.prod.yml等覆盖文件,可实现开发、测试、生产三环境统一管理。
直接用环境变量注入 + 多文件叠加,就能干净地支撑开发、测试、生产三套环境,不用改代码、不复制配置、不手动替换。
环境变量从哪来:四层来源与覆盖顺序
Compose 启动时会按固定顺序读取变量,后读到的同名变量会覆盖前面的:
- docker-compose.yml 中 environment 字段 —— 优先级最高,适合写死调试开关或强制值
-
运行时宿主机的环境变量 —— 比如在终端执行
DB_HOST=prod-db docker compose up - env_file 指定的文件 —— 可写多个,按列表顺序加载,后加载的覆盖先加载的
-
项目根目录的 .env 文件 —— 默认自动读取,适合放通用默认值(如
APP_VERSION=latest)
两种主流注入方式怎么选
用 environment 直接写:适合少量、静态、非敏感的值,比如 -NODE_ENV=production 或 -DEBUG=false。清晰直观,但不适合密钥、地址这类易变或敏感项。
用 env_file 外部加载:推荐用于数据库连接串、API 密钥、端口等。支持多文件组合,例如:
env_file:
- .env.common
- .env.${ENV_TYPE:-development}
配合命令 ENV_TYPE=production docker compose up,就能自动加载 .env.production。
多环境配置的轻量高效方案
不建议为每个环境建一整套 docker-compose.xxx.yml。更实用的是“1 个基础文件 + N 个覆盖片段 + 环境变量驱动”:
- 保留
docker-compose.yml做服务骨架(镜像、网络、卷声明) - 用
docker-compose.override.yml放本地开发配置(热挂载、调试端口) - 另建
docker-compose.prod.yml控制生产行为(资源限制、重启策略、精简端口) - 启动时组合:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up
所有环境共用同一份基础定义,差异只在覆盖层里,维护成本低、不易遗漏。
安全与协作必须注意的细节
.env 文件别提交到 Git —— 它常含密码、密钥,务必加进 .gitignore。提供 .env.example 供团队参考格式。
敏感信息尽量避免出现在 environment: 下,因为会暴露在 docker inspect 结果中;优先走 env_file,再升级用 Docker Secrets(Swarm)或外部配置中心(K8s)。
变量引用记得加默认值防报错,比如 ${DB_PORT:-5432},避免因漏设变量导致容器启动失败。











