如何通过ADO Pipeline将镜像推送到其他Azure账户的ACR?
跨Azure账户推送镜像到ACR的解决方法
方法1:用Azure CLI手动完成登录与推送
绕开Docker@2任务对服务连接类型的限制,直接用Azure CLI登录目标账户后执行Docker命令:
- 添加Azure CLI任务,登录目标Azure账户并完成ACR登录:
- task: AzureCLI@2 displayName: 登录目标Azure账户及ACR inputs: azureSubscription: 'MyAZConnection' # 你现有的azurerm类型服务连接 scriptType: bash inlineScript: | # 用目标账户的服务主体登录(提前把SP的ID、密码、租户ID存为ADO秘密变量) az login --service-principal -u $(target-sp-client-id) -p $(target-sp-secret) --tenant $(target-tenant-id) # 登录到目标ACR az acr login --name <目标ACR名称>
- 接着用Bash任务执行镜像打标签和推送:
- task: Bash@3 displayName: 推送镜像到目标ACR inputs: inlineScript: | docker tag <本地镜像名>:<版本标签> <目标ACR登录服务器>/<镜像名>:<版本标签> docker push <目标ACR登录服务器>/<镜像名>:<版本标签>
注意:目标账户的服务主体必须拥有ACR的AcrPush权限,所有敏感信息要存在ADO的秘密变量里,别明文写在管道里。
方法2:手动创建跨账户的Docker Registry服务连接
不需要依赖同一微软账户订阅,直接手动配置Docker Registry类型的服务连接:
- 进入ADO项目的设置 > 服务连接,点击新建服务连接,选择Docker Registry。
- 选择Docker Hub或其他注册表,填写目标ACR的登录服务器(格式如
xxx.azurecr.io)、用户名(可以用ACR管理员账户名,或者目标账户的服务主体ID)、密码(管理员密码或服务主体密码)。 - 测试连接通过后保存,之后在Docker@2任务里用这个新服务连接:
- task: Docker@2 displayName: Push image to ACR inputs: command: push containerRegistry: '<新建的Docker Registry服务连接名>' repository: '<镜像名>' tags: '<版本标签>'
方法3:给源账户服务主体授权目标ACR推送权限
如果目标账户管理员允许,直接把你现有MyAZConnection对应的服务主体加到目标ACR的权限列表里:
- 在目标Azure账户的ACR资源中,进入访问控制(IAM),添加角色分配,选择
AcrPush角色,指定源账户的服务主体为受让人。 - 之后管道里直接用现有服务连接登录,再操作ACR:
- task: AzureCLI@2 displayName: 登录源账户并访问目标ACR inputs: azureSubscription: 'MyAZConnection' scriptType: bash inlineScript: | az acr login --name <目标ACR名称> - task: Bash@3 displayName: 推送镜像到目标ACR inputs: inlineScript: | docker tag <本地镜像名>:<版本标签> <目标ACR登录服务器>/<镜像名>:<版本标签> docker push <目标ACR登录服务器>/<镜像名>:<版本标签>
内容的提问来源于stack exchange,提问作者NikR31
相关产品推荐
相关产品推荐

