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

如何通过编程方式获取Azure Container Registry的镜像及标签列表

嘿,我之前也被这个问题卡过好一阵!你说的没错,刚开始找资料的时候确实容易只看到Docker.DotNet针对本地镜像的操作,找不到直接对接ACR的方法,甚至看REST API的时候也会误以为只有管理类接口。其实有几种靠谱的方案,我给你整理一下:

如何编程获取Azure Container Registry的镜像及标签列表

方法一:用Azure官方Container Registry SDK(最推荐)

微软专门出了针对ACR的SDK,比Docker.DotNet更贴合场景,用起来也省心。以.NET为例,步骤如下:

  1. 先安装NuGet包:
dotnet add package Azure.Containers.ContainerRegistry
  1. 编写代码获取镜像和标签:
using Azure.Containers.ContainerRegistry;
using Azure.Identity;

// 替换成你的ACR名称
var acrName = "your-acr-name";
var registryUri = new Uri($"https://{acrName}.azurecr.io");

// 用DefaultAzureCredential自动处理身份验证,支持本地Azure CLI登录、Azure环境托管身份等场景
var client = new ContainerRegistryClient(registryUri, new DefaultAzureCredential());

// 遍历所有镜像仓库
await foreach (var repo in client.GetRepositoriesAsync())
{
    Console.WriteLine($"找到镜像仓库: {repo.Name}");
    
    // 获取当前仓库下的所有标签
    var repoClient = client.GetRepository(repo.Name);
    await foreach (var tag in repoClient.GetTagsAsync())
    {
        Console.WriteLine($"  标签: {tag.Name}");
    }
}

这个SDK还支持获取镜像的清单信息、删除镜像等操作,权限方面只要给服务主体或用户分配AcrPull角色就够了,不用管理员权限。

方法二:调用Azure CLI命令(适合脚本/跨语言场景)

如果不想引入SDK依赖,也可以直接在代码里调用Azure CLI的命令,解析输出结果就行。前提是本地或运行环境已经安装了Azure CLI,并且完成了登录(az login)。

比如C#里的示例:

using System.Diagnostics;
using System.Text.Json;

var acrName = "your-acr-name";

// 获取所有镜像仓库列表
var repoProcess = Process.Start(new ProcessStartInfo
{
    FileName = "az",
    Arguments = $"acr repository list --name {acrName} --output json",
    RedirectStandardOutput = true,
    UseShellExecute = false,
    CreateNoWindow = true
});
var reposJson = await repoProcess.StandardOutput.ReadToEndAsync();
repoProcess.WaitForExit();

var repos = JsonSerializer.Deserialize<List<string>>(reposJson);
foreach (var repo in repos)
{
    // 获取当前仓库的所有标签
    var tagProcess = Process.Start(new ProcessStartInfo
    {
        FileName = "az",
        Arguments = $"acr repository show-tags --name {acrName} --repository {repo} --output json",
        RedirectStandardOutput = true,
        UseShellExecute = false,
        CreateNoWindow = true
    });
    var tagsJson = await tagProcess.StandardOutput.ReadToEndAsync();
    tagProcess.WaitForExit();
    
    var tags = JsonSerializer.Deserialize<List<string>>(tagsJson);
    Console.WriteLine($"仓库「{repo}」的标签: {string.Join(", ", tags)}");
}

这种方式好处是跨语言通用,不管你用Python、Java还是Shell脚本,都能调用CLI命令来实现。

方法三:直接调用ACR的REST API

你之前可能没找对正确的API端点,ACR其实提供了专门查询仓库和标签的接口,步骤稍微复杂一点,但灵活性最高:

  1. 获取访问令牌:可以通过Azure AD获取,或者用az acr login --name your-acr-name --expose-token命令提取令牌(适合测试)。
  2. 调用API查询:
    • 获取所有仓库:GET https://{acrName}.azurecr.io/v2/_catalog
    • 获取指定仓库的标签:GET https://{acrName}.azurecr.io/v2/{repoName}/tags/list
      请求头需要带上Authorization: Bearer <你的令牌>

用C# HttpClient的示例代码:

using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;

var acrName = "your-acr-name";
var accessToken = "your-acquired-token"; // 替换成实际获取的令牌

using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

// 获取所有仓库
var catalogResp = await client.GetAsync($"https://{acrName}.azurecr.io/v2/_catalog");
catalogResp.EnsureSuccessStatusCode();
var catalogJson = await catalogResp.Content.ReadAsStringAsync();
var catalog = JsonSerializer.Deserialize<CatalogResponse>(catalogJson);
Console.WriteLine($"仓库总数: {catalog.Repositories.Count}");

// 遍历仓库获取标签
foreach (var repo in catalog.Repositories)
{
    var tagsResp = await client.GetAsync($"https://{acrName}.azurecr.io/v2/{repo}/tags/list");
    tagsResp.EnsureSuccessStatusCode();
    var tagsJson = await tagsResp.Content.ReadAsStringAsync();
    var tagsResult = JsonSerializer.Deserialize<TagResponse>(tagsJson);
    
    Console.WriteLine($"仓库「{repo}」的标签: {string.Join(", ", tagsResult.Tags)}");
}

// 辅助类用于解析JSON
public class CatalogResponse
{
    public List<string> Repositories { get; set; }
}

public class TagResponse
{
    public string Name { get; set; }
    public List<string> Tags { get; set; }
}

一些注意事项

  • 权限控制:不管用哪种方法,确保操作账户或服务主体拥有ACR的AcrPull角色(最小权限原则),不要用管理员账户。
  • 身份验证:优先使用Azure AD身份验证(比如SDK里的DefaultAzureCredential),比管理员账户的用户名密码更安全,也更适合生产环境。
  • Docker.DotNet的替代方案:其实Docker.DotNet也能连接ACR,只要把镜像仓库地址设为ACR的地址,并且配置正确的身份验证(比如用Azure AD令牌作为Docker密码),但专门的ACR SDK更简洁,不需要处理Docker的协议细节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:40:32