首页/云/云与容器速查/Compose 环境变量与 env_file
容器与 Docker106 条

Compose 环境变量与 env_file

三层来源要分清:宿主机环境参与 ${VAR} 插值;environment 把值注入容器;env_file 从文件批量注入。项目目录的 .env 默认只用于插值,不会自动进容器。

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

Compose 的变量来源

Compose 的环境变量要分清三层:宿主机环境与项目目录的 .env 参与配置里的变量插值,environment 把值注入容器,env_file 从文件批量注入。最容易踩的坑是以为 .env 会自动进容器——它默认只是插值来源,不会注入容器环境。

基本信息

插值在 compose 文件里用 ${VAR} 引用宿主机环境或项目 .env 的值
默认值${VAR:-default} 提供默认值,另有报错与提示两种语义
environment以映射或列表形式注入容器环境变量
env_file从文件批量注入,适合分组管理非敏感配置
优先级宿主机环境优先于 .env;容器内 environment 覆盖镜像自带值
密钥用 secrets 机制或部署时注入,不要提交进仓库

三层来源对比

来源作用对象典型用途
宿主机环境变量配置插值CI 与部署时传参
项目 .env配置插值本地开发提供默认值
environment容器内环境少量固定配置
env_file容器内环境成组的非敏感配置
secrets容器内文件密钥与证书

示例

示例
services:
  app:
    image: myapp:1.2.3
    environment:
      LOG_LEVEL: ${LOG_LEVEL:-info}   # 插值:取自宿主环境或 .env
      DB_HOST: db                     # 字面量:直接注入容器
    env_file:
      - ./config/app.env              # 从文件批量注入

典型使用场景

  • 本地开发用 .env 提供默认值,CI 用环境变量覆盖
  • 把成组的非敏感配置集中到 env_file 便于维护
  • 用默认值语法避免变量缺失导致启动报错
  • 密钥走 secrets 或部署时注入,不进版本库
.env 只是插值来源,不会自动进入容器;要让容器读到某个值,必须写进 environment 或 env_file。
优先级顺序要记牢:宿主机 shell 环境覆盖 .env,容器内 environment 覆盖镜像里的同名变量,排查生效值时按这个顺序看。
密钥写进 compose 文件会随仓库一起泄露;改用 .env 并加入忽略列表,或使用 secrets 机制。
排查时可先把最终渲染出来的配置与容器内实际生效的环境变量对比一遍,一次就能分清问题出在插值阶段还是注入阶段。

易错点

  • .env 放好却以为容器能读到:它只是插值来源,进容器要用 environment 或 env_file
  • 变量未导出导致插值不生效:容器里拿到空值,启动报错
  • 密钥写进 compose 文件并提交:凭据随仓库泄露
  • 环境变量优先级搞反:本地覆盖不了 CI 传入的值,排查方向跑偏
  • 把 .env 与 env_file 混用一处:同一变量两处定义,实际生效值难以判断

数据来源与参考

  • Docker Docs:Environment variables in Compose

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌