docker compose 中 .env 文件仅用于模板变量替换,不能直接注入容器运行时环境;多环境需结合 env_file 加载不同环境变量文件(如 .env.dev/.env.prod)并用 environment 等变量控制加载逻辑。

在 Docker Compose 中,通过 .env 文件加载环境变量仅影响 Compose 模板本身的变量替换(如 ${VAR}),**不能直接注入到容器运行时的环境变量中**。要实现“多环境配置变量”(例如 dev/staging/prod),需结合 env_file + 外部环境文件 + 变量覆盖机制,而非依赖单一 .env。
区分两种“环境变量”:Compose 解析层 vs 容器运行层
Docker Compose 有两套环境变量体系:
-
Compose 文件解析时的变量:来自项目根目录的
.env(或--env-file指定),用于替换docker-compose.yml中的${DB_HOST}等占位符; -
容器启动时的环境变量:由服务定义中的
environment或env_file提供,最终出现在容器内env命令输出中。
多环境配置的关键是:让不同环境使用不同的 env_file,并配合外部变量控制 Compose 文件行为(如镜像 tag、端口)。
用 env_file 指定运行时环境变量文件
在服务中使用 env_file 加载具体环境的变量文件(如 .env.dev、.env.prod):
services:
app:
image: myapp:${APP_VERSION:-latest}
env_file:
- .env.${ENVIRONMENT:-dev}
environment:
- APP_ENV=${ENVIRONMENT}
然后准备对应文件:
-
.env.dev:DB_URL=postgresql://dev-db:5432/myapp -
.env.prod:DB_URL=postgresql://prod-db:5432/myapp
启动时指定环境:ENVIRONMENT=prod docker-compose up,Compose 会自动加载 .env.prod 并注入容器。
配合顶层 .env 控制 Compose 模板行为
根目录 .env 可设默认值,用于动态生成镜像名、端口等:
# .env APP_VERSION=1.2.0 API_PORT=8080 ENVIRONMENT=dev
这样 docker-compose.yml 中可写:
services:
api:
image: myapi:${APP_VERSION}
ports:
- "${API_PORT}:8080"
启动时可通过 ENVIRONMENT=prod APP_VERSION=v1.2.0 docker-compose up 覆盖默认值,无需修改文件。
进阶:用多个 compose 文件分层管理多环境
推荐方式:基础配置 + 环境覆盖:
-
docker-compose.yml:通用服务定义(无敏感配置); -
docker-compose.prod.yml:只覆盖env_file、资源限制、健康检查等生产相关项; - 启动命令:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml --env-file .env.prod up。
其中 --env-file .env.prod 是给 Compose 解析层用的(影响 yml 内容),而 env_file: .env.prod 是给容器用的 —— 二者可指向同一文件,但作用域不同。
不复杂但容易忽略:.env 文件只参与 Compose 解析,容器环境必须显式用 env_file 或 environment 声明。多环境的本质是“按需加载不同 env_file + 变量驱动配置差异”。










