docker compose支持${var_name}语法插值,从shell或.env文件读取变量;未定义时默认为空,可用${var:-default}设默认值,${var:?msg}触发错误,适用于image、ports等字符串字段,不支持键名、数字或嵌套。

在 compose.yml(或旧版 docker-compose.yml)中,你可以用 ${VAR_NAME} 语法引用环境变量,实现配置插值。Docker Compose 会在启动服务前从宿主机的 shell 环境或指定的 .env 文件中读取这些变量。
基础插值写法
直接使用 ${VAR} 即可替换为对应环境变量值。如果变量未定义,默认为空字符串;你也可以提供默认值:
-
${PORT}→ 取系统环境变量PORT的值 -
${PORT:-8080}→ 若PORT未设置,使用默认值8080 -
${PORT:?请设置 PORT}→ 若PORT为空或未定义,Compose 启动时报错并提示
支持插值的位置
插值可用于大多数字符串字段,常见包括:
-
image: myapp:${TAG}(镜像标签) -
ports: - "${HOST_PORT:-3000}:80"(端口映射) -
environment: - DB_HOST=${DB_HOST}(传给容器的环境变量) -
volumes: - ${DATA_DIR:-./data}:/app/data(卷挂载路径)
注意:不能用于键名、布尔值、数字字段(如 restart: ${POLICY} 会报错),也不支持嵌套插值(如 ${${SERVICE_NAME}_PORT} 不合法)。
加载环境变量的来源
Docker Compose 按以下优先级加载变量:
- 当前 shell 中已导出的环境变量(
export MY_VAR=123) - 项目根目录下的
.env文件(每行KEY=VALUE,不支持注释和空格环绕)
例如 .env 文件内容:
LOG_LEVEL=info
之后在 compose.yml 中就能直接写 image: nginx:${TAG} 和 environment: - LOG_LEVEL=${LOG_LEVEL}。
验证与调试技巧
运行 docker compose config(或旧版 docker-compose config)可展开所有插值,输出最终解析后的配置,方便检查变量是否生效、路径是否正确、默认值是否被采纳。若看到原始 ${VAR} 未被替换,说明该变量未定义或拼写错误。











