Docker Compose中设置环境变量默认值的核心是${VAR:-default}语法,当VAR未定义或为空时使用default;该语法适用于environment字段,冒号后不可有空格,且空字符串也会触发兜底。
在 compose.yml 中设置环境变量的默认兜底值,核心是用 ${VAR:-default} 语法 —— 这是 Docker Compose 支持的 Shell 风格变量展开,当环境变量未定义或为空时,自动使用默认值。
这是最常用的方式。在 environment 列表中,对每个变量显式指定带默认值的表达式:
services:app:image: myapp:latestenvironment:- DATABASE_URL=${DATABASE_URL:-sqlite:///app.db}- LOG_LEVEL=${LOG_LEVEL:-info}- DEBUG=${DEBUG:-false}
注意:冒号后面不能有空格;:- 是固定语法;如果变量本身设为空字符串(DATABASE_URL=""),该语法仍会触发兜底(即认为空)。
如果变量较多,可配合 .env 文件 + env_file 使用,但要注意:env_file 不支持兜底语法,它只做键值加载。兜底逻辑仍需写在 environment 或服务配置里:
.env 中写基础变量(如 PORT=8000),不写兜底compose.yml 中继续用 ${PORT:-3000} 覆盖或补充Docker Compose 对 ${VAR:-default} 的判断逻辑是:只要 VAR 在 shell 环境中被声明(哪怕值为空),就不触发兜底。所以:
export API_KEY="" 后再运行 docker compose up,${API_KEY:-missing} 仍为空,不会变成 missing
unset API_KEY 或根本没 export 过${VAR:+value} / ${VAR:-} 组合判断利用 Compose 的自定义扩展(x-defaults)可提高可维护性,虽不被引擎解析,但方便团队约定和工具读取:
x-defaults:env:DATABASE_URL: sqlite:///app.dbLOG_LEVEL: info
services: app: image: myapp:latest environment:
注意:这需要配合外部工具(如 yq、自定义脚本)预处理,原生 Compose 不解析 x-* 字段,纯属约定增强可读性。