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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:50:55