<p>用 env_file 实现多环境配置解耦,核心是按环境拆分变量文件(如.env.dev、.env.test、.env.prod),在服务中通过 env_file: - .env.${ENVIRONMENT:-dev} 动态加载,并配合 environment 字段覆盖或兜底,确保一份 docker-compose.yml 适配多环境,同时避免敏感信息硬编码。</p>

用 env_file 实现多环境配置解耦,核心在于把不同环境的变量分文件管理,并在服务定义中按需加载。它不依赖外部命令参数,也不修改主配置结构,真正做到了“一份 docker-compose.yml,多个运行时环境”。
按环境拆分变量文件
把开发、测试、生产等环境的变量分别写进独立文件,比如:
-
.env.dev:包含DB_URL=postgresql://localhost:5432/dev、DEBUG=true -
.env.test:包含DB_URL=postgresql://test-db:5432/test、LOG_LEVEL=info -
.env.prod:包含DB_URL=postgresql://prod-cluster:5432/main、DEBUG=false
所有文件都放在 docker-compose.yml 同级目录下,格式严格为 KEY=value,等号两边不能有空格,# 开头行为注释。
在服务中动态引用对应文件
利用变量替换机制,让 env_file 的路径随环境自动变化:
services:
app:
image: myapp:${APP_VERSION:-latest}
env_file:
- .env.${ENVIRONMENT:-dev}
environment:
- APP_ENV=${ENVIRONMENT}
这样启动时只需设置 ENVIRONMENT=prod,Compose 就会自动加载 .env.prod;不设则默认加载 .env.dev。路径始终相对于 docker-compose.yml 所在位置。
配合 environment 字段做最终覆盖
env_file 提供基础变量,environment 可用于强制覆盖关键项或注入运行时动态值:
- 例如在
.env.prod中写LOG_LEVEL=warn,但想临时调试时加一行- LOG_LEVEL=debug到environment,就能生效 - 也可以用
- NODE_ENV=${NODE_ENV:-production}提供兜底值,避免变量未定义导致启动失败
这种组合方式既保持了配置分离,又保留了灵活干预的能力。
避免常见陷阱
几个容易出错但很关键的点:
-
.env文件(根目录)只影响docker-compose.yml解析阶段的${VAR}替换,不会自动进容器 —— 想进容器必须靠env_file或environment -
env_file加载顺序就是列表顺序,后面文件里同名变量会覆盖前面的,可借此做“公共+特有”分层(如先加.env.common再加.env.prod) - 敏感信息(密码、密钥)不要硬编码在
docker-compose.yml里,哪怕用了变量占位符,也应确保其来源文件不提交到代码库


















