核心方式是直接使用${VAR_NAME}语法,Docker Compose在解析时自动从宿主机shell环境读取已export的变量;支持${VAR:-default}默认值语法,未导出的变量不生效,可通过docker compose config验证替换结果。

在 compose.yml(或 docker-compose.yml)中引用系统全局环境变量,核心方式是直接使用 ${VAR_NAME} 语法,Docker Compose 会在解析文件时自动从宿主机环境中读取对应变量。
注意:这仅适用于 Compose 文件中定义的服务配置字段(如 environment、image、ports 等),且变量需在运行 docker compose up 命令的当前 shell 环境中已导出(exported)。
关键前提:变量必须已导出
比如在 Linux/macOS 中,仅设置 MY_PORT=8080 不够,必须执行:
export MY_PORT=8080
Windows PowerShell 中用:
$env:MY_PORT="8080"
CMD 中用:
set MY_PORT=8080
不支持未导出的 shell 变量或脚本内局部变量
H3 使用方式示例
-
在
environment中传递给容器:services: app: image: nginx environment: - PORT=${MY_PORT:-3000} # 支持默认值语法 - ENVIRONMENT=${ENV:-production} -
在
ports、image等字段中直接插值:services: api: image: myapp:${APP_VERSION:-latest} ports: - "${API_PORT:-8000}:80"
H3 默认值与空值处理
-
${VAR}:若VAR未设置或为空,Compose 会报错(除非字段允许空值) -
${VAR:-default}:VAR未设置或为空时,使用default -
${VAR-default}:仅在VAR未设置时用默认值(空字符串仍被采用)
✅ 推荐统一用:-形式,更安全
H3 如何验证变量是否生效
运行前检查当前环境是否含目标变量:
echo $MY_PORT # Linux/macOS echo %MY_PORT% # Windows CMD
启动时加 --verbose 或先用 docker compose config 查看实际解析结果:
docker compose config
该命令会输出最终生效的配置,所有 ${...} 都已被替换,可直观确认变量是否被正确读取。
H3 补充说明
-
.env文件优先级高于系统环境变量,但它是项目级静态文件,不是“系统全局变量” - 若同时存在
.env和同名系统变量,系统变量不会覆盖.env中的值(.env优先) - 想强制使用系统变量?删掉
.env或确保其中不定义同名变量 - 多级嵌套变量(如
${${VAR}})不支持,Compose 不解析嵌套
不复杂但容易忽略


















