You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Shell参数修改docker compose build构建的镜像名称?

问题:如何通过命令行参数修改Docker Compose中构建的镜像名称

用户初始的docker-compose.yaml配置:

version: "3.9"
services:
  # Base image containing dependencies.
  base:
    image: mycustomimage
    build:
      context: .
      dockerfile: docker/Dockerfile

用户希望通过docker compose build的--build-arg参数传递Shell变量(如$CI_REGISTRY_IMAGE)来修改镜像名称,于是修改yaml为:

version: "3.9"
services:
  # Base image containing dependencies.
  base:
    image: ${IMAGE_NAME}
    build:
      context: .
      dockerfile: docker/Dockerfile

执行命令后出现警告,镜像名称未被正确替换:

$ docker compose build --build-arg IMAGE_NAME=$CI_REGISTRY_IMAGE
time="2023-08-28T20:03:44Z" level=warning msg="The \"IMAGE_NAME\" variable is not set. Defaulting to a blank string."

用户疑问:是否有无需直接修改docker-compose.yaml文件的实现方法?


解决方案

首先要明确:--build-arg是传递给Docker构建过程的参数,只能在Dockerfile中通过ARG指令引用,无法直接替换Docker Compose配置文件中的变量。Compose配置里的${IMAGE_NAME}属于Compose的变量替换机制,它会读取环境变量或.env文件中的值,和--build-arg是完全独立的两个机制。

以下是两种无需修改原docker-compose.yaml的实现方法:

方法一:通过环境变量直接传递

直接在执行docker compose build前导出环境变量,或者在命令行中临时设置:

# 方式1:先导出环境变量
export IMAGE_NAME=$CI_REGISTRY_IMAGE
docker compose build

# 方式2:一行命令临时设置
IMAGE_NAME=$CI_REGISTRY_IMAGE docker compose build

Compose会自动读取当前环境中的IMAGE_NAME变量,替换配置里的${IMAGE_NAME}占位符。

方法二:使用临时环境变量文件

如果不想污染当前Shell的环境变量,可以创建临时的.env文件供Compose读取:

# 生成临时.env文件
echo "IMAGE_NAME=$CI_REGISTRY_IMAGE" > .env.tmp
# 指定该文件执行构建
docker compose --env-file .env.tmp build
# 构建完成后删除临时文件
rm .env.tmp

Compose会优先使用--env-file指定的文件中的变量来替换配置里的占位符。


内容的提问来源于stack exchange,提问作者andrestoga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:23:12