如何使用Azure JavaScript SDK获取Azure ACR访问令牌?
如何通过Azure JavaScript SDK获取ACR登录令牌用于docker login?
问题背景
我拥有Azure订阅并使用Azure Container Registry(ACR),需要执行docker login操作访问仓库。通过CLI可轻松实现,命令如下:
TOKEN=$(az acr login --name <acrName> --expose-token --output tsv --query accessToken) docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN
请问能否通过官方SDK(尤其是JavaScript SDK)获取该令牌?我已按如下方式实例化ACR客户端,但未找到获取令牌的方法:
const credential = new DefaultAzureCredential(); const client = new ContainerRegistryClient(endpoint, credential);
作为参考,在AWS ECR中可通过ECR客户端的GetAuthorizationTokenCommand命令实现,响应包含令牌:
{ // GetAuthorizationTokenResponse authorizationData: [ // AuthorizationDataList { // AuthorizationData authorizationToken: "STRING_VALUE", expiresAt: new Date("TIMESTAMP"), proxyEndpoint: "STRING_VALUE", }, ], };
解决方案
可以通过Azure JavaScript SDK获取ACR的登录令牌,无需依赖ContainerRegistryClient的特定方法,直接用DefaultAzureCredential即可获取针对ACR资源的访问令牌,具体步骤如下:
1. 安装必要依赖
确保项目中安装了Azure身份验证和容器注册表的SDK包:
npm install @azure/identity @azure/container-registry
2. 获取ACR访问令牌
通过DefaultAzureCredential请求ACR资源的令牌,资源范围指定为你的ACR登录服务器加上.default后缀:
const { DefaultAzureCredential } = require("@azure/identity"); async function fetchAcrLoginToken(acrName) { const credential = new DefaultAzureCredential(); // 构建ACR的资源范围 const resourceScope = `https://${acrName}.azurecr.io/.default`; // 获取令牌 const tokenResult = await credential.getToken(resourceScope); return { accessToken: tokenResult.token, expiresAt: tokenResult.expiresOn }; } // 调用示例 const targetAcrName = "myregistry"; fetchAcrLoginToken(targetAcrName).then(tokenInfo => { console.log("获取到的ACR令牌:", tokenInfo.accessToken); console.log("令牌过期时间:", tokenInfo.expiresAt); });
3. 用令牌执行docker login
拿到令牌后,就可以和CLI方式一样执行docker login,用户名固定为00000000-0000-0000-0000-000000000000:
const { exec } = require("child_process"); async function loginToAcr(acrName) { const tokenInfo = await fetchAcrLoginToken(acrName); const loginServer = `${acrName}.azurecr.io`; const username = "00000000-0000-0000-0000-000000000000"; return new Promise((resolve, reject) => { exec( `docker login ${loginServer} --username ${username} --password-stdin`, { input: tokenInfo.accessToken }, (error, stdout, stderr) => { if (error) { reject(new Error(`登录失败: ${error.message}`)); return; } if (stderr) { reject(new Error(`登录错误输出: ${stderr}`)); return; } resolve(stdout); } ); }); } // 执行登录 loginToAcr(targetAcrName) .then(result => console.log("ACR登录成功:", result)) .catch(err => console.error(err));
关键说明
DefaultAzureCredential会自动适配本地开发(Azure CLI登录)、环境变量、托管身份等多种凭据来源,无需手动配置。- 确保你的凭据(本地账号或服务主体)拥有ACR的
AcrPull(拉取镜像)或更高权限(如AcrPush)。 - 令牌的有效期由Azure控制,一般为1小时,过期后重新调用
getToken即可获取新令牌。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

