如何使用go-containerregistry查询指定GCP项目下的GCR镜像仓库
问题根因
你当前的代码直接调用remote.Catalog查询整个gcr.io registry的全局目录,GCR服务端不会关联本地gcloud的project配置做过滤,因此会返回当前账号有权限访问的所有项目、组织下的镜像仓库。
修改方案
不用查询全局registry目录,改为直接查询指定项目/组织下的仓库列表,你可以通过以下步骤修改代码:
- 读取本地gcloud配置的当前目标项目ID,避免硬编码
- 调用
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
相关产品推荐
相关产品推荐

