如何将AzureCLI凭据传入docker run供容器内DefaultAzureCredential使用?
解决方案
针对你的场景,以下几种方式可让容器内的DefaultAzureCredential完成ARM认证:
方案1:传递AzureCLI任务的服务主体凭据到容器
AzureCLI@2任务执行时会自动使用流水线的服务主体(或托管标识)认证,你可将这些凭据导出为环境变量,再传递给Docker容器,DefaultAzureCredential会自动识别:
YAML配置示例
- task: AzureCLI@2 displayName: 'Run Docker container with Azure credentials' inputs: azureSubscription: '<你的服务连接名称>' scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | # 导出服务主体凭据为环境变量 export AZURE_CLIENT_ID=$(az account show --query clientId -o tsv) export AZURE_TENANT_ID=$(az account show --query tenantId -o tsv) export AZURE_CLIENT_SECRET=$(az account get-access-token --query accessToken -o tsv) # 运行Docker容器并传递环境变量 docker run -e AZURE_CLIENT_ID=$AZURE_CLIENT_ID \ -e AZURE_TENANT_ID=$AZURE_TENANT_ID \ -e AZURE_CLIENT_SECRET=$AZURE_CLIENT_SECRET \ <你的镜像名称> python <你的脚本路径>
说明
DefaultAzureCredential会优先读取AZURE_CLIENT_ID、AZURE_TENANT_ID、AZURE_CLIENT_SECRET这三个环境变量,以此完成服务主体认证,无需额外配置。
方案2:将System.AccessToken转换为ARM访问令牌并传递
System.AccessToken是流水线的OAuth令牌,需先转换成ARM资源的访问令牌,再传递给容器,让DefaultAzureCredential通过AZURE_TOKEN环境变量识别:
YAML配置示例
- task: AzureCLI@2 displayName: 'Run Docker container with pipeline token' inputs: azureSubscription: '<你的服务连接名称>' scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | # 使用System.AccessToken获取ARM访问令牌 ARM_TOKEN=$(az account get-access-token --resource https://management.azure.com/ --query accessToken -o tsv --identity --username $(System.AccessToken)) # 运行Docker容器并传递ARM令牌 docker run -e AZURE_TOKEN=$ARM_TOKEN \ <你的镜像名称> python <你的脚本路径>
说明
容器内的DefaultAzureCredential会检测到AZURE_TOKEN环境变量,直接使用该令牌调用ARM API。需确保流水线的服务连接(或托管标识)拥有操作Azure ML资源的权限。
方案3:生成Azure配置文件并挂载到容器
在AzureCLI@2任务中先执行az login生成本地配置文件,再将该目录挂载到容器对应路径:
YAML配置示例
- task: AzureCLI@2 displayName: 'Run Docker container with mounted Azure config' inputs: azureSubscription: '<你的服务连接名称>' scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: | # 创建临时目录存放Azure配置 AZURE_CONFIG_DIR=$(mktemp -d) export AZURE_CONFIG_DIR=$AZURE_CONFIG_DIR # 登录Azure生成配置文件 az login --service-principal -u $(az account show --query clientId -o tsv) -p $(az account get-access-token --query accessToken -o tsv) --tenant $(az account show --query tenantId -o tsv) # 运行Docker容器,挂载配置目录到容器的/root/.azure docker run -v $AZURE_CONFIG_DIR:/root/.azure \ <你的镜像名称> python <你的脚本路径>
说明
这种方式模拟本地开发时的~/.azure目录,容器内的DefaultAzureCredential会自动读取该目录下的配置文件完成认证。
内容的提问来源于stack exchange,提问作者freesqrt
相关产品推荐
相关产品推荐

