You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在az container create中使用托管身份访问Azure DevOps仓库?

使用托管身份替代令牌访问Azure DevOps仓库(Azure Container Instances场景)

问题背景

我尝试在执行az container create时,用托管身份(MI)替代用户名+令牌的方式访问Azure DevOps代码仓库,但使用无凭证的gitrepo-url时容器构建阶段挂起;换成带用户名和令牌的URL则能正常构建连接。

挂起的命令示例

az container create `
--resource-group rgname`
--name con-name `
--location centralus `
--os-type Linux `
--acr-identity $(az identity show --name mi-name --resource-group rg-name --query id --output tsv) `
--assign-identity $(az identity show --name mi-name --resource-group rg-name --query id --output tsv) `
--image acrurl.azurecr.io/img:tag `
--cpu 1 `
--memory 1 `
--restart-policy Never `
--command-line "/bin/bash -c 'cd home/site/repo; git checkout docker-mi; dbt debug'" `
--protocol TCP `
--ports 80 `
--gitrepo-url "https://dev.azure.com/org/devops/_git/dbtproject" `
--gitrepo-mount-path home/site `

正常工作的命令片段

--gitrepo-url "https://azurereposuser:123456789abdc@dev.azure.com/org/devops/_git/dbtproject" `
--gitrepo-mount-path home/site 

核心问题说明

Azure Container Instances(ACI)的--gitrepo-url参数不支持直接通过托管身份进行Git仓库认证,该参数仅支持HTTP/HTTPS URL带明文凭证、或SSH密钥的认证方式。直接使用无凭证URL+托管身份会因认证失败导致仓库克隆挂起。


解决步骤

1. 为托管身份授予Azure DevOps仓库访问权限

先确保托管身份能访问目标仓库:

  • 进入Azure DevOps项目的项目设置→权限→用户
  • 点击添加用户,搜索并选择托管身份(需选"Azure Active Directory用户"类型)
  • 为该身份分配贡献者或读者权限,确保权限作用到目标Git仓库

2. 自定义容器镜像,内置MI认证逻辑

需要在镜像中实现"用MI获取Azure DevOps令牌→克隆仓库"的逻辑:

2.1 修改Dockerfile,添加依赖

确保镜像安装azure-cli(用于获取MI令牌)和git:

FROM acrurl.azurecr.io/img:tag

# 安装Azure CLI和Git
RUN apt-get update && apt-get install -y azure-cli git

2.2 编写启动脚本start.sh

#!/bin/bash

# 用托管身份获取Azure DevOps专属访问令牌
TOKEN=$(az account get-access-token --resource 499b84ac-1321-427f-aa17-267ca6975798 --query accessToken --output tsv)

# 克隆仓库:用户名可填任意字符串,Azure DevOps仅验证令牌
git clone https://dummyuser:$TOKEN@dev.azure.com/org/devops/_git/dbtproject /home/site/repo

# 执行原有业务命令
cd /home/site/repo
git checkout docker-mi
dbt debug

注:499b84ac-1321-427f-aa17-267ca6975798是Azure DevOps的固定资源ID,无需修改。

2.3 构建并推送新镜像到ACR

# 构建镜像
docker build -t acrurl.azurecr.io/img:mi-tag .

# 推送至容器注册表
az acr login --name acrurl
docker push acrurl.azurecr.io/img:mi-tag

3. 修改az container create命令

移除--gitrepo-url和--gitrepo-mount-path参数,改用自定义镜像和启动脚本:

az container create `
--resource-group rgname`
--name con-name `
--location centralus `
--os-type Linux `
--acr-identity $(az identity show --name mi-name --resource-group rg-name --query id --output tsv) `
--assign-identity $(az identity show --name mi-name --resource-group rg-name --query id --output tsv) `
--image acrurl.azurecr.io/img:mi-tag `
--cpu 1 `
--memory 1 `
--restart-policy Never `
--command-line "/bin/bash /start.sh" `
--protocol TCP `
--ports 80

4. 调试排查(若仍有问题)

  • 在start.sh中添加az identity show命令,确认托管身份被正确识别
  • 临时输出TOKEN变量值,验证是否获取到有效令牌

内容的提问来源于stack exchange,提问作者marko0o

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:28:28