如何使用Azure DevOps代理在不同租户的ACR间共享镜像
跨Azure租户ACR共享镜像的实现方案
方案1:ACR原生跨租户镜像同步(推荐)
利用Azure容器注册表的镜像同步功能直接完成跨租户镜像复制,无需代理中转,是最高效的方式。
配置步骤:
- 在dev ACR中,为prod租户的托管标识(或prod ACR对应的服务主体)分配
AcrPull权限,允许prod侧拉取dev ACR的镜像; - 在prod ACR中创建同步任务,指定源镜像路径为
devacr.azurecr.io/[镜像名]:[版本],目标路径为prod ACR的对应地址; - 设置触发规则:可选择当dev ACR推送新镜像时自动同步,或手动/定时触发;
- 触发任务后,验证prod ACR中是否已生成同步后的镜像。
方案2:通过现有自托管代理池中转复制
如果无法使用ACR原生同步,可借助已有的双租户代理池完成镜像拉取-推送流程:
操作步骤:
- 权限配置:
- 给dev托管标识分配dev ACR的
AcrPull权限,给prod托管标识分配prod ACR的AcrPush权限; - 给prod托管标识额外分配dev ACR的
AcrPull权限(不建议在生产环境开启dev ACR匿名拉取);
- 给dev托管标识分配dev ACR的
- 流水线编排:
- 用dev代理池拉取dev ACR的镜像:
docker pull devacr.azurecr.io/[镜像名]:[版本]; - 切换到prod代理池,重新标记镜像为prod ACR路径:
docker tag devacr.azurecr.io/[镜像名]:[版本] prodacr.azurecr.io/[镜像名]:[版本]; - 推送标记后的镜像到prod ACR:
docker push prodacr.azurecr.io/[镜像名]:[版本];
- 用dev代理池拉取dev ACR的镜像:
- 注意事项:
- 确保代理节点有足够磁盘空间存储镜像;
- 流水线中需严格校验镜像版本,避免同步错误版本。
方案3:Azure存储中转(备选)
若以上两种方式受限,可通过跨租户存储账户中转镜像文件:
操作步骤:
- 在dev租户,用代理将镜像导出为tar包:
docker save devacr.azurecr.io/[镜像名]:[版本] -o [镜像名]-[版本].tar; - 将tar包上传至配置了跨租户权限的Azure Blob存储(给prod托管标识分配
StorageBlobDataContributor权限); - 在prod租户,用代理下载tar包并导入prod ACR:
docker load -i [镜像名]-[版本].tar docker tag [镜像名]:[版本] prodacr.azurecr.io/[镜像名]:[版本] docker push prodacr.azurecr.io/[镜像名]:[版本]
内容的提问来源于stack exchange,提问作者Krzysztof Madej
相关产品推荐
相关产品推荐

