咨询:Azure中托管容器镜像供VSTS发布代理拉取的配置方法
解决Azure DevOps发布管道拉取自定义工具容器镜像的配置步骤
首先,你需要把预装工具的容器镜像托管到Azure容器注册表(ACR)——这是Azure专门用于存储容器镜像的服务,再配置Azure DevOps管道的访问权限,就能让代理顺利拉取镜像并运行工具处理产物了。下面是具体的配置流程:
1. 创建Azure容器注册表并推送镜像
- 如果你还没有ACR,先在Azure门户创建:搜索「容器注册表」,填写名称、关联资源组、选择SKU(Basic版本足够起步),记得启用「管理员用户」(测试场景可用,生产建议用更安全的服务主体)。
- 本地构建好工具镜像后,用Docker命令推送到ACR:
# 登录到你的ACR az acr login --name <你的ACR名称> # 给镜像打符合ACR要求的标签:ACR登录服务器地址/镜像名:版本 docker tag <本地镜像名>:<版本> <你的ACR登录服务器>/<镜像名>:<版本> # 推送镜像到ACR docker push <你的ACR登录服务器>/<镜像名>:<版本>
2. 配置Azure DevOps访问ACR的权限
推荐两种授权方式,按需选择:
方式一:服务主体授权(生产环境首选)
- 用Azure CLI创建一个服务主体,给它分配ACR的「AcrPull」(仅拉取)角色:
执行后会得到az ad sp create-for-rbac --name "acr-pull-sp" --role "AcrPull" --scopes /subscriptions/<你的订阅ID>/resourceGroups/<资源组名>/providers/Microsoft.ContainerRegistry/registries/<你的ACR名称>appId(服务主体ID)、password(密钥)、tenant(租户ID),务必保存好这些信息。 - 回到Azure DevOps项目,进入「项目设置」→「服务连接」→「新建服务连接」,选择「Azure资源管理器」→「服务主体(手动)」,填入刚才的订阅ID、租户ID、服务主体ID和密钥,给服务连接命名(比如
ACR-Pull-Connection)后保存。
方式二:ACR管理员账号授权(测试场景用)
- 在Azure门户的ACR「访问密钥」页面,复制管理员用户名和密码。
- 在Azure DevOps里创建「Docker Registry」类型的服务连接,注册表URL填你的ACR登录服务器(格式如
xxx.azurecr.io),填入管理员账号密码后保存。
3. 在发布管道中调用容器镜像
有两种常用的实现方式:
方式一:用Azure DevOps内置Docker任务
- 添加「Docker」任务,动作选择「Run」,在「容器注册表」下拉框选择你刚创建的服务连接,「镜像名称」填ACR中的镜像路径(比如
<你的ACR登录服务器>/<镜像名>:<版本>)。 - 在「命令参数」里挂载构建产物目录,比如把代理本地的构建产物目录
$(Build.ArtifactStagingDirectory)映射到容器内的/app/build-output:
这样容器里的预装工具就能直接处理挂载进来的构建产物了。-v $(Build.ArtifactStagingDirectory):/app/build-output
方式二:用脚本直接执行docker run
- 先添加「Azure CLI」任务,选择之前的服务连接,执行登录ACR的命令:
az acr login --name <你的ACR名称> - 再添加「Shell Script」或「PowerShell」任务,执行
docker run命令,记得挂载产物目录并指定工具处理命令:
其中docker run --rm -v $(Build.ArtifactStagingDirectory):/app/build-output <你的ACR登录服务器>/<镜像名>:<版本> <你的工具处理命令>--rm会在容器运行结束后自动删除容器,避免占用资源。
额外注意事项
- 微软托管的Azure DevOps代理默认可以访问同订阅下的ACR;如果是自托管代理,要确保代理所在网络能连通ACR(比如在同一个VNet,或者ACR开启了允许公网访问)。
- 不要把ACR设置为公开访问,必须通过服务主体或管理员账号授权拉取,保证镜像的安全性。
内容的提问来源于stack exchange,提问作者xtreampb
相关产品推荐
相关产品推荐

