docker compose 通过 env_file 指令按顺序加载多个 .env 文件实现分层配置,后加载文件中同名变量覆盖前者;支持敏感信息隔离(如 .env.secrets)、多环境标准化(.env.base/.env.development/.env.production)及与 environment 字段协同使用。

直接用 env_file 指令加载多个 .env 文件,是 Docker Compose 批量管理配置最实用、最可控的方式。它不依赖命令行参数,全部定义在 docker-compose.yml 里,适合团队协作和 CI/CD 场景。
env_file 加载顺序与覆盖规则
env_file 支持按顺序列出多个文件,Docker Compose 会从上到下依次读取,后加载的同名变量自动覆盖前面的值。这个机制就是批量分层配置的基础。
- 写法示例(yml 中):
services:
app:
image: myapp:v1
env_file:
- .env.base
- .env.local
- 加载逻辑:先读
.env.base(通用配置),再读.env.local(本地覆盖项),比如LOG_LEVEL=debug在后者中定义,就会生效 - 注意:不能有空格或注释在等号两侧,
KEY=value是唯一合法格式;以#开头的行会被忽略
敏感信息隔离与权限控制
把密钥、数据库密码等敏感内容单独拆到 .env.secrets 类文件中,配合 env_file 引入,既清晰又安全。
- 在
docker-compose.yml中显式引入:
env_file: - .env.common - .env.secrets
- 立即执行权限收紧(防止被其他用户读取):
chmod 600 .env.secrets chown $USER:$USER .env.secrets
- 务必把
.env.secrets加入.gitignore;提供.env.secrets.example供新成员参考
多环境配置的标准化组织方式
用 env_file + 文件命名约定,就能自然支持 dev/test/prod 等环境,无需改代码。
- 推荐文件结构:
.env.base # 公共变量:APP_NAME、VERSION、PORT .env.development # 开发专属:DEBUG=true、API_MOCK=on .env.production # 生产专属:DEBUG=false、JWT_SECRET=xxx
- 不同环境启动时,只需切换 yml 中的
env_file列表,例如生产环境写成:
env_file: - .env.base - .env.production
- CI/CD 中可结合变量动态生成 yml 片段,或用脚本替换
env_file行 —— 配置始终集中、可审计
与 environment 字段协同使用
env_file 提供批量基础配置,environment 用于关键服务级覆盖或临时调试,二者互补不冲突。
- 典型组合用法:
services:
api:
image: api:v1
env_file:
- .env.base
- .env.${ENVIRONMENT:-development}
environment:
- TZ=Asia/Shanghai
- NODE_ENV=${NODE_ENV:-production}
- 说明:
${ENVIRONMENT}由宿主机 shell 提供(如ENVIRONMENT=prod docker-compose up),优先级高于env_file;而TZ这类全局固定项,直接写environment更直观 - 注意:yml 中的
${...}变量解析只发生在 Compose 解析阶段,不是容器运行时行为











