如何通过编程方式获取Azure Container Registry的镜像及标签列表
嘿,我之前也被这个问题卡过好一阵!你说的没错,刚开始找资料的时候确实容易只看到Docker.DotNet针对本地镜像的操作,找不到直接对接ACR的方法,甚至看REST API的时候也会误以为只有管理类接口。其实有几种靠谱的方案,我给你整理一下:
如何编程获取Azure Container Registry的镜像及标签列表
方法一:用Azure官方Container Registry SDK(最推荐)
微软专门出了针对ACR的SDK,比Docker.DotNet更贴合场景,用起来也省心。以.NET为例,步骤如下:
- 先安装NuGet包:
dotnet add package Azure.Containers.ContainerRegistry
- 编写代码获取镜像和标签:
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其实提供了专门查询仓库和标签的接口,步骤稍微复杂一点,但灵活性最高:
- 获取访问令牌:可以通过Azure AD获取,或者用
az acr login --name your-acr-name --expose-token命令提取令牌(适合测试)。 - 调用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
相关产品推荐
相关产品推荐

