CI/CD流水线构建镜像推送ACR报错:本地镜像不存在如何解决
问题原因
构建任务生成的镜像标签是基于Docker Hub仓库格式($(container.registry_dockerhub)/$(container.name):<tag>),但推送任务尝试推送的是ACR仓库格式的镜像($(container.registry_acr)/$(container.name):<tag>),本地不存在后者对应的标签,因此触发报错。
解决方案
提供两种可行的调整方式:
方式一:构建时直接打ACR标签
在构建阶段直接生成带有ACR仓库路径的镜像标签,同时保留Docker Hub的服务连接用于拉取基础镜像:
- task: Docker@2 displayName: 'Build image with ACR tags' inputs: containerRegistry: '$(container.registry_dockerhub)' # 用于拉取Docker Hub基础镜像 repository: '$(container.registry_acr)/$(container.name)' # 指定ACR完整仓库路径 Dockerfile: '**/Dockerfile' command: 'build' tags: | latest $(projectversion) arguments: --build-arg PIP_EXTRA_INDEX_URL=$(PIP_EXTRA_INDEX_URL) - task: Docker@2 displayName: 'Push image to ACR' inputs: containerRegistry: '$(container.registry_acr)' repository: '$(container.registry_acr)/$(container.name)' command: 'push' tags: | latest $(projectversion)
也可以直接在tags里指定完整的ACR镜像路径,无需修改repository:
tags: | $(container.registry_acr)/$(container.name):latest $(container.registry_acr)/$(container.name):$(projectversion)
方式二:构建后添加标签转换步骤
先按原有配置构建Docker Hub标签的镜像,再通过tag命令生成ACR格式的标签,最后推送:
- task: Docker@2 displayName: 'Build image' inputs: containerRegistry: '$(container.registry_dockerhub)' repository: '$(container.name)' Dockerfile: '**/Dockerfile' command: 'build' tags: | latest $(projectversion) arguments: --build-arg PIP_EXTRA_INDEX_URL=$(PIP_EXTRA_INDEX_URL) - task: Docker@2 displayName: 'Tag image for ACR (latest)' inputs: command: 'tag' sourceImage: '$(container.registry_dockerhub)/$(container.name):latest' targetImage: '$(container.registry_acr)/$(container.name):latest' - task: Docker@2 displayName: 'Tag image for ACR (versioned)' inputs: command: 'tag' sourceImage: '$(container.registry_dockerhub)/$(container.name):$(projectversion)' targetImage: '$(container.registry_acr)/$(container.name):$(projectversion)' - task: Docker@2 displayName: 'Push image to ACR' inputs: containerRegistry: '$(container.registry_acr)' repository: '$(container.name)' command: 'push' tags: | latest $(projectversion)
额外提示
确保$(container.registry_dockerhub)对应的服务连接已配置Docker Hub账号密码,登录后能大幅降低触发429限流的概率。
内容的提问来源于stack exchange,提问作者kiesel
相关产品推荐
相关产品推荐

