compose env_file 是什么
env_file 让服务从文件里读取环境变量,按「每行一个键值对」的格式注入容器。它适合把成组配置集中存放,例如数据库连接参数、日志级别、第三方凭据;相比在编排文件里逐条写 environment,把变量放文件更便于按环境替换与权限控制。多个文件可以叠加,靠后的文件优先。
基本信息
| 写法 | env_file: 路径 或列表形式 - 文件A - 文件B |
|---|---|
| 文件格式 | KEY=value 每行一条,可用 # 注释 |
| 优先级 | 后面的文件覆盖前面的;environment 中显式写的再覆盖其上 |
| 路径基准 | 相对项目目录(编排文件所在目录) |
| 与 .env 区别 | env_file 注入容器;.env 只供编排文件插值 |
| 安全性 | 文件应加入版本控制忽略清单,仓库里只放示例文件 |
典型使用场景
- 多个服务共用一份公共配置,再各自追加差异文件
- 按环境拆分配置:开发、预发、生产各一份变量文件
- 把凭据留在部署机上单独管理,不进代码仓库
- 迁移服务时集中替换连接参数,不用逐条改编排文件
- 排查变量来源:结合 environment 与插值确认最终取值
编排文件写法
编排文件写法
services:
api:
image: app/api:1.4.2
env_file:
- .env.common # 公共配置:日志、时区等
- .env.api # 服务专属配置,同名键覆盖前者
environment:
LOG_LEVEL: debug # 显式声明优先级最高,便于临时调整变量文件与验证
变量文件与验证
# 变量文件示例(每行一个键值对,注意不要有多余空格与引号习惯差异)
cat > .env.api <<'EOF'
# 数据库连接
DB_HOST=db
DB_PORT=5432
DB_NAME=appdb
EOF
# 渲染最终配置,确认变量已按预期合并(注意避免把敏感值输出到公开渠道)
docker compose config | sed -n '1,60p'
# 运行后核对容器内实际环境变量
docker compose up -d api
docker compose exec api env | sort | head -30变量来源优先级
| 来源 | 作用对象 | 优先级 |
|---|---|---|
| shell 环境变量 | 编排文件插值 | 最高 |
| 项目 .env | 编排文件插值 | 中 |
| env_file 声明顺序 | 容器环境变量 | 后声明的更高 |
| environment 字段 | 容器环境变量 | 高于 env_file |
| 镜像内 ENV | 容器默认值 | 最低 |
两种变量的职责要分清:编排文件里的插值(读取项目级 .env 或 shell 环境)决定 Compose 如何渲染配置,env_file 决定容器里有什么环境变量,互不替代。
把含有口令的变量文件提交进代码仓库是常见事故。文件名加入忽略清单,仓库中只保留不含真实值的示例文件,并对部署机上的文件设置较严格权限。