首页/云/Docker 容器速查/项目级 .env 文件与变量来源优先级
Compose 编排55 条

项目级 .env 文件与变量来源优先级

项目目录下的 .env 供 Compose 文件做变量插值:宿主环境变量优先于 .env,可用 --env-file 指定其他文件。

Docker 容器速查云更新于 2026-10-13

项目级 .env 是什么

Compose 会在项目目录下寻找名为 .env 的文件,用它为编排文件里的变量占位符提供取值,例如镜像标签、端口号、域名等都可以写成 ${TAG} 由这个文件注入。要点是它只参与 Compose 自己解析文件时的替换,不会自动进入容器。变量来源有优先级:当前 shell 里的环境变量会盖过 .env 里的同名项,这也是 CI 上覆盖默认值的常用手段。

基本信息

默认位置执行 compose 命令时的项目目录下 .env
引用语法${TAG}、${TAG:-默认值}、${TAG:?必须提供}
优先级shell 环境变量 > .env 文件
换文件docker compose --env-file .env.prod config / up
与 env_file 区别env_file 决定容器内的环境变量,.env 只供文件插值
验证命令docker compose config 渲染出替换后的最终配置

典型使用场景

  • 不同环境用不同镜像标签:本地 .env 写开发标签,CI 用环境变量覆盖为发布版本
  • 集中管理端口与域名,避免在多处硬编码
  • 把敏感值留在本机 .env 并加入忽略清单,仓库里只放示例文件
  • 用 ${VAR:?} 形式让缺失的必填配置直接报错,避免带着空值部署
  • 排查变量不生效:渲染最终配置看实际取值

声明与使用

声明与使用
services:
  api:
    image: app/api:${TAG:-1.4.2}          # 缺省值:未提供时用 1.4.2
    ports:
      - "${API_PORT:-8080}:8080"
    environment:
      LOG_LEVEL: ${LOG_LEVEL:-info}        # 需要传进容器必须显式引用
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD:?必须提供数据库口令}

环境与验证

环境与验证
# .env 写本地默认值,仓库里只保留 .env.example
 cat >> .env <<'EOF'
TAG=1.4.2-dev
API_PORT=8080
EOF

# shell 变量优先级更高,适合在 CI 里覆盖
 TAG=1.4.3 docker compose config --services

# 指定其他文件,多环境切换不必改目录
 docker compose --env-file .env.prod config | head -30

# 查看渲染结果,确认变量替换符合预期(注意别把含密钥的输出贴到公开渠道)
 docker compose config

变量来源与生效范围

来源影响对象优先级
shell 环境变量Compose 插值最高
项目 .envCompose 插值中
--env-file 指定文件Compose 插值替代 .env
env_file 字段容器内环境变量服务级
environment 字段容器内环境变量覆盖 env_file
镜像内 ENV容器默认值最低
.env 里的变量不会自动进容器:要在 environment 或 env_file 里显式引用。这一点最容易混淆,排查「容器里读不到变量」时先确认走的是哪条链路。
.env 常被用来存放口令与密钥,务必加入版本控制的忽略清单,仓库里只保留不带真实值的示例文件,避免凭据随代码外泄。

易错点

  • 在别的目录执行 compose 命令读不到项目 .env,注意项目目录定位或显式使用 --env-file
  • 把 .env 与 env_file 混用后排查变量来源困难,先跑 config 看最终渲染值再定位
  • shell 里残留的同名变量会覆盖 .env 的默认值,导致行为与文件描述不一致
  • 键名拼错或未定义的变量会被替换成空字符串,服务带着空配置启动,用 ${VAR:?} 让缺失尽早暴露

数据来源与参考

  • Docker 官方文档:Compose 环境变量与 .env(docs.docker.com/compose/environment-variables)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌