Azure Pipelines本地构建Docker镜像A、B不推ACR报错求助
问题描述
我有容器镜像A,以及基于A扩展的镜像B,想用Azure Pipeline构建二者后通过Docker Compose运行,要求不推送镜像到Azure容器注册表(ACR),仅用Pipeline的本地构建上下文操作。但构建镜像B时出现错误:
Step 1/17 : FROM azure.repo.xxx/A:1.0.0
manifest for azure.repo.xxx/A:1.0.0 not found: manifest unknown: manifest tagged by "1.0.0" is not found
当前Pipeline任务配置如下:
- task: Docker@2 displayName: Build docker image A inputs: command: build containerRegistry: 'azure.acr' buildContext: '$(Pipeline.Workspace)' arguments: '--build-arg REPO_PATH=azure.repo.xxx --build-arg IMG_NAME=azure.repo.xxx/A:1.0.0' dockerfile: 'A/Dockerfile' - task: Docker@2 displayName: Build docker image B inputs: command: build containerRegistry: 'azure.acr' buildContext: '$(Pipeline.Workspace)' arguments: '--build-arg IMG_NAME=azure.repo.xxx/B:1.0.0' dockerfile: 'B/Dockerfile'
问题原因
- 构建镜像A时,给镜像打的标签是
azure.repo.xxx/A:1.0.0(带ACR仓库前缀),Docker会默认认为这是远程仓库的镜像标签 - 构建镜像B时,Dockerfile里的
FROM azure.repo.xxx/A:1.0.0会触发Docker去ACR远程拉取该镜像,而非使用本地刚构建好的镜像A - 配置中的
containerRegistry: 'azure.acr'让Docker任务默认关联远程ACR,进一步强化了去远程查找的行为
解决方案
核心思路:给本地构建的镜像A打不带ACR前缀的本地标签,让Docker在构建B时优先使用本地镜像,而非远程仓库。
步骤1:修改镜像A的构建任务
移除ACR关联配置,给镜像打纯本地标签:
- task: Docker@2 displayName: Build docker image A inputs: command: build # 移除containerRegistry,避免关联远程ACR buildContext: '$(Pipeline.Workspace)' # 给镜像打本地标签,比如A:1.0.0 arguments: '--tag A:1.0.0 --build-arg REPO_PATH=azure.repo.xxx' dockerfile: 'A/Dockerfile'
步骤2:修改镜像B的Dockerfile和构建任务
- 调整B的Dockerfile,使用本地标签的镜像A作为基础:
# 替换原来的FROM azure.repo.xxx/A:1.0.0 FROM A:1.0.0 # 后续构建步骤...
- 调整镜像B的Pipeline任务,同样移除远程ACR关联:
- task: Docker@2 displayName: Build docker image B inputs: command: build # 移除containerRegistry buildContext: '$(Pipeline.Workspace)' arguments: '--tag B:1.0.0' dockerfile: 'B/Dockerfile'
步骤3:Docker Compose配置调整
后续运行时,直接使用本地标签的镜像:
version: '3' services: service-a: image: A:1.0.0 # 其他配置... service-b: image: B:1.0.0 # 其他配置...
补充说明
- 如果后续需要推送镜像到ACR,可以单独添加
push命令的Docker任务,在本地构建完成后再执行推送操作 - 确保Pipeline代理机器上的Docker服务正常运行,本地镜像能被Docker正确识别
内容的提问来源于stack exchange,提问作者Andrei Mladin
相关产品推荐
相关产品推荐

