Docker Compose环境变量优先级从高到低为:environment字段定义的变量、env_file引入的变量文件、宿主机shell环境变量、根目录.env文件;推荐按环境拆分.env.dev/.env.prod等文件并通过--env-file指定加载,结合${VAR:-default}和${VAR:?required}语法保障健壮性与安全性。

容器环境参数注入需要兼顾灵活性与安全性,关键在于分层控制变量来源,并明确各环节的优先级。不同环境(dev/test/staging/prod)的配置差异不能靠修改代码实现,而应通过外部化机制动态注入。
按优先级组织变量来源
Docker Compose 加载环境变量有固定顺序,从高到低依次为:
- docker-compose.yml 中 environment 字段显式定义的变量:覆盖力最强,适合强制指定的运行时参数(如 ENV=prod)
- 通过 env_file 引入的变量文件(如 .env.prod):支持多套配置并存,部署时按需挂载
- 宿主机 shell 环境变量:运行 docker-compose 命令时已存在的变量,适合 CI/CD 流水线中注入密钥或版本号
- 项目根目录下的 .env 文件:默认自动加载,仅作开发默认值,不应存放敏感信息
用变量替换语法做安全兜底
在 docker-compose.yml 中使用 ${VAR_NAME:-default} 可避免因变量缺失导致服务启动失败。例如:
environment:
- DB_HOST=${DB_HOST:-localhost}
- DB_PORT=${DB_PORT:-5432}
- SECRET_KEY=${SECRET_KEY:?required}其中 ${SECRET_KEY:?required} 表示若未设置则报错退出,防止生产环境漏配关键密钥。
按环境拆分 env_file 并配合 profile 使用
不推荐只靠一个 .env 文件切换环境,而是为每个环境准备独立变量文件:
-
.env.dev:含本地数据库地址、调试开关等 -
.env.staging:连接预发数据库,启用监控但不发通知 -
.env.prod:关闭日志详细输出,启用 HTTPS 强制跳转
启动时指定:
docker-compose --env-file .env.prod up -d
这样既隔离配置,又避免误用。
Spring Boot 容器内再适配(可选增强)
当容器启动 Spring Boot 应用时,还可叠加框架层环境控制:
- 通过
environment注入SPRING_PROFILES_ACTIVE=prod - 应用自动加载
application-prod.yml,与容器外变量形成两级配置 - 敏感字段(如数据库密码)仍由容器环境注入,不写入 yml 文件

















