如何将Azure凭据从Azure Ubuntu VM注入Docker容器?
将Azure认证凭据传递到Docker容器的解决方案
为什么挂载$HOME/.azure无效?
常见原因包括:
- 权限问题:容器内运行用户没有读取挂载目录的权限
- 路径不匹配:容器内运行用户不是root,挂载到
/root/.azure无法被识别 - CLI版本兼容:容器内Azure CLI版本与VM上的版本不一致,导致凭据格式不兼容
方案1:通过环境变量传递服务主体凭据
如果VM上是通过服务主体完成的az login,可以直接导出当前有效凭据为环境变量,传递给容器:
- 在VM上执行以下命令导出凭据信息:
# 获取服务主体ID和租户ID AZURE_CLIENT_ID=$(az account show --query "user.name" -o tsv) AZURE_TENANT_ID=$(az account show --query "tenantId" -o tsv) # 获取当前有效的访问令牌 AZURE_ACCESS_TOKEN=$(az account get-access-token --query "accessToken" -o tsv) - 运行容器时传入这些环境变量:
docker run -e AZURE_CLIENT_ID=$AZURE_CLIENT_ID \ -e AZURE_TENANT_ID=$AZURE_TENANT_ID \ -e AZURE_ACCESS_TOKEN=$AZURE_ACCESS_TOKEN \ <你的镜像名称>
容器内的Azure CLI会自动读取这些环境变量完成认证,无需额外执行az login。
方案2:利用VM的托管标识直接认证(推荐)
如果VM使用的是Azure托管标识(系统分配/用户分配)完成认证,容器可以直接复用VM的标识权限,无需传递任何凭据:
- 系统分配托管标识:直接在容器内执行
az login --identity即可,运行容器时无需额外配置:docker run <你的镜像名称> /bin/sh -c "az login --identity && <你的业务命令>" - 用户分配托管标识:需要指定标识的客户端ID:
docker run <你的镜像名称> /bin/sh -c "az login --identity --username <托管标识客户端ID> && <你的业务命令>"
默认情况下,容器使用bridge网络即可访问VM的实例元数据服务,完成标识认证。
方案3:修复$HOME/.azure挂载的权限问题
如果坚持使用挂载目录的方式,需要解决权限和路径匹配问题:
- 查看VM上
$HOME/.azure的权限信息:ls -ld $HOME/.azure - 选择以下一种方式调整容器运行配置:
- 匹配用户ID运行容器:以VM当前用户的UID/GID运行容器,挂载到容器内对应用户的
.azure目录:docker run -u $(id -u):$(id -g) \ -v $HOME/.azure:/home/$(whoami)/.azure \ <你的镜像名称> - 临时调整目录权限(不推荐,存在安全风险):
chmod -R 755 $HOME/.azure docker run -v $HOME/.azure:/root/.azure <你的镜像名称>
- 匹配用户ID运行容器:以VM当前用户的UID/GID运行容器,挂载到容器内对应用户的
同时要确保容器内的Azure CLI版本与VM上的版本一致,避免凭据格式不兼容问题。
内容的提问来源于stack exchange,提问作者Ben Harper
相关产品推荐
相关产品推荐

