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 机制。
排查时可先把最终渲染出来的配置与容器内实际生效的环境变量对比一遍,一次就能分清问题出在插值阶段还是注入阶段。