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

如何使用go-containerregistry查询指定GCP项目下的GCR镜像仓库

问题根因

你当前的代码直接调用remote.Catalog查询整个gcr.io registry的全局目录,GCR服务端不会关联本地gcloud的project配置做过滤,因此会返回当前账号有权限访问的所有项目、组织下的镜像仓库。

修改方案

不用查询全局registry目录,改为直接查询指定项目/组织下的仓库列表,你可以通过以下步骤修改代码:

  1. 读取本地gcloud配置的当前目标项目ID,避免硬编码
  2. 调用google.ListRepos方法(go-containerregistry库专门封装的GCR项目级查询接口)获取对应项目下的所有仓库

修改后的完整代码如下:

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/google/go-containerregistry/pkg/v1/google"
)

func main() {
	// 读取gcloud本地配置的当前项目ID
	projID, err := google.ProjectFromEnv()
	if err != nil {
		log.Fatalf("读取gcloud项目配置失败: %v,请先执行gcloud config set project 你的项目ID", err)
	}

	ctx := context.Background()
	// 直接查询指定项目下的所有GCR仓库
	repos, err := google.ListRepos(ctx, projID, google.WithAuthFromKeychain())
	if err != nil {
		log.Fatalf("查询项目仓库失败: %v", err)
	}

	for _, repoName := range repos {
		// 输出完整的仓库地址,格式为 gcr.io/[项目ID]/[镜像名]
		fmt.Printf("gcr.io/%s/%s\n", projID, repoName)
	}
}
补充说明
  • 如果你要查询的是组织下的仓库,直接把projID替换为对应的组织ID即可,无需额外修改逻辑
  • 如果你需要硬编码指定项目/组织,直接给projID变量赋值为目标项目/组织ID即可,不需要调用google.ProjectFromEnv()
  • 如果你使用的是GCR的区域镜像站(比如eu.gcr.io、us.gcr.io),可以在google.ListRepos的参数中新增google.WithRegistry("对应区域的域名")即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:36:09