如何通过编程方式将Docker容器推送至Azure Container Registry
Azure ACR 容器镜像.NET程序推送实现方案
Azure官方没有单独封装容器镜像推送的专用.NET API,因为ACR完全兼容Docker/OCI标准镜像仓库协议,推送动作可通过通用容器操作能力配合Azure身份认证实现,主流实现分两类:
方案1:运行环境已部署Docker daemon(实现成本最低)
你不需要处理镜像分层计算、哈希校验等底层逻辑,只需要四步完成:
- 用
Azure.IdentityNuGet包获取对应ACR的登录凭证:如果开了ACR管理员账户,可直接调用Azure资源管理接口拉取管理员用户名和密码;也可以用服务主体/托管身份直接生成ACR临时登录令牌,有效期最长3小时,安全性更高。 - 完成Docker客户端的ACR身份认证:可以直接调用本地
docker login <acr名称>.azurecr.io -u <用户名> -p <密码/令牌>命令,也可以用Docker.DotNetNuGet包调用Docker API的AuthAsync方法完成登录,避免启动子进程。 - 给本地待推送镜像打ACR专属标签:标签格式要求为
<acr名称>.azurecr.io/<自定义仓库名>:<版本号>,可通过docker tag命令或Docker.DotNet的Images.TagImageAsync方法实现。 - 执行推送:调用
Docker.DotNet的Images.PushImageAsync方法,或者直接运行docker push <打标后的完整镜像名>即可完成推送。
方案2:无Docker daemon的轻量化运行环境
如果程序运行环境没有部署Docker服务,不想依赖外部进程,可以用原生.NET库直接操作镜像完成推送:
- 引入
Azure.Containers.ContainerRegistryNuGet包,初始化ContainerRegistryClient时传入ACR访问域名和DefaultAzureCredential,自动完成Azure身份认证,不需要手动处理登录令牌。 - 如果镜像已经导出为tar包,可直接读取镜像分层数据,依次上传分层blob、镜像manifest到对应ACR仓库即可,整个过程不需要调用Docker服务,资源消耗更低。
注意事项:
- 执行推送的身份(用户、服务主体、托管身份)必须被分配对应ACR的
AcrPush角色权限,否则会返回403权限错误。- 镜像标签命名需符合ACR规则,不能包含大写字母、特殊符号,默认不允许重复推送相同标签的镜像,需要覆盖可在ACR配置中开启可重复写入。
内容的提问来源于stack exchange,提问作者Mason Wheeler
相关产品推荐
相关产品推荐

