如何自动化从azurecr.io拉取Docker镜像及容器运行(含身份验证)?
解决Azure容器注册表(ACR)镜像自动化拉取/运行的登录问题
方案1:使用Azure服务主体(Service Principal)实现非交互式登录
这是适用于本地或非Azure环境工作站的通用方案:
创建服务主体并分配ACR权限
在Azure上创建一个服务主体,为其分配ACR的镜像拉取权限(AcrPull角色):az ad sp create-for-rbac --name acr-pull-sp --scopes /subscriptions/<你的订阅ID>/resourceGroups/<资源组名>/providers/Microsoft.ContainerRegistry/registries/<你的ACR名称> --role AcrPull执行后会返回包含
appId、password、tenant的JSON结果,请妥善保存这三个值。在工作站配置非交互式登录
两种可选方式:- 方式一:通过Azure CLI登录(自动同步Docker凭证)
az login --service-principal -u <appId> -p <password> --tenant <tenant> - 方式二:直接给Docker配置ACR登录凭证
docker login my_registry.azurecr.io -u <appId> -p <password>
凭证会被Docker保存,有效期内无需重复登录,也可定时执行命令刷新。
- 方式一:通过Azure CLI登录(自动同步Docker凭证)
集成到自动化脚本
将命令写入shell脚本,通过cron定时执行:#!/bin/bash # 服务主体登录Docker docker login my_registry.azurecr.io -u <你的appId> -p <你的password> # 拉取最新镜像 docker pull my_registry.azurecr.io/my_image:latest # 清理旧容器(按需) docker stop my_container || true docker rm my_container || true # 启动新容器 docker run -d --name my_container ... my_registry.azurecr.io/my_image:latest安全提示:避免明文存储密码,可使用环境变量或Azure Key Vault管理敏感信息。
方案2:使用Azure托管标识(仅适用于Azure虚拟机/规模集)
如果你的工作站是Azure VM,可通过托管标识实现无密码登录:
为VM启用托管标识
- 系统分配标识:在Azure门户VM页面的「标识」>「系统分配」中开启并保存。
- 用户分配标识:先创建用户分配标识,再在VM的「标识」>「用户分配」中添加。
为标识分配ACR权限
az role assignment create --assignee <标识的客户端ID/对象ID> --scope /subscriptions/<订阅ID>/resourceGroups/<资源组名>/providers/Microsoft.ContainerRegistry/registries/<ACR名称> --role AcrPull在VM上配置Docker登录
通过Azure实例元数据服务获取令牌并登录:# 获取ACR访问令牌 TOKEN=$(curl -s "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F" -H "Metadata: true" | jq -r .access_token) # Docker登录ACR docker login my_registry.azurecr.io -u 00000000-0000-0000-0000-000000000000 -p $TOKEN令牌会自动刷新,无需存储任何密码,适合长期自动化场景。
方案3:使用ACR管理员账户(仅测试用)
ACR自带管理员账户,启用后可直接用其凭证登录,但因权限过高、泄露风险大,不建议生产环境使用:
- 在Azure门户ACR页面的「访问密钥」中启用「管理员用户」,复制用户名和密码。
- 执行登录命令:
docker login my_registry.azurecr.io -u <管理员用户名> -p <管理员密码>
内容的提问来源于stack exchange,提问作者malfonsoarquimea
相关产品推荐
相关产品推荐

