docker compose 通过 ${var} 变量插值动态替换镜像标签,支持环境变量或 .env 文件注入,需提前设置变量;可用 docker-compose config 验证解析结果。

在 docker-compose.yml 中动态替换镜像标签,核心是利用 Docker Compose 的变量插值机制(${VAR}),配合环境变量或 `.env` 文件实现。它本身不执行运行时计算,但支持静态替换——也就是说,你得提前把标签值准备好,再让 Compose 读取并填入。
用环境变量直接注入标签
最常用的方式:启动前设置环境变量,Compose 会自动读取并替换 ${IMAGE_TAG} 这类占位符。
- 终端中先设置:
export IMAGE_TAG=1.2.3(Linux/macOS)或set IMAGE_TAG=1.2.3(Windows CMD) -
docker-compose.yml中写成:image: myapp:${IMAGE_TAG} - 运行
docker-compose up,实际拉取的就是myapp:1.2.3
用 .env 文件统一管理变量
适合多环境或多人协作,避免污染 shell 环境。
- 项目根目录新建
.env文件,内容如:IMAGE_TAG=dev-202405 -
docker-compose.yml写法不变:image: myapp:${IMAGE_TAG} - Compose 默认加载同目录下的
.env,无需额外参数 - 注意:
.env只影响docker-compose.yml解析,不影响容器内环境
组合多个变量构建复杂标签
支持嵌套和默认值,提升灵活性。
- 例如:
image: nginx:${NGINX_VERSION:-alpine},若未设NGINX_VERSION,则用alpine - 也可以拼接:
image: myapp:${CI_COMMIT_REF_SLUG}-${BUILD_NUMBER},配合 CI 工具传入变量 - 变量名区分大小写,且只支持字母、数字、下划线
常见陷阱和验证方法
容易出错的地方往往不在语法,而在变量作用域和加载时机。
- 变量必须在
docker-compose up命令执行前已存在;临时 export 在子 shell 里无效 - 用
docker-compose config查看最终解析结果,确认标签是否被正确替换 - 镜像名中不能有空格或特殊字符(如
/、:),否则解析失败 -
.env文件不会被 Git 跟踪,敏感值(如私有 registry token)别误提交











