如何使用Golang列出GCR中的所有Docker仓库
Go语言枚举GCR所有仓库的实现方案
你可以直接使用go-containerregistry库内置的google.Walk方法实现GCR根路径下所有仓库的递归枚举,不需要预先知道任何仓库名。
前置要求
- 提前完成GCR身份认证,本地环境可通过
gcloud auth configure-docker完成认证,程序运行时会自动读取本地认证凭据,也可通过环境变量传入Service Account密钥指定身份。 - 你需要知道自己的GCR根路径,格式为
[registry地址]/[GCP项目ID],默认全局Registry地址为gcr.io,区域级Registry可使用对应区域前缀,比如asia.gcr.io、us.gcr.io。
实现代码示例
package main import ( "fmt" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/v1/google" ) func main() { // 替换为你的GCR根路径 gcrRoot := "gcr.io/your-gcp-project-id" // 递归遍历所有仓库 err := google.Walk(gcrRoot, google.WalkOptions{ Auth: authn.DefaultKeychain, }, func(repoPath string, tags *google.Tags, walkErr error) error { if walkErr != nil { return walkErr } // 打印遍历到的仓库路径 fmt.Printf("仓库:%s\n", repoPath) // 可在此处继续处理当前仓库的标签、镜像信息 for tag, manifestInfo := range tags.Manifests { fmt.Printf(" 标签:%s,镜像哈希:%s\n", tag, manifestInfo.Digest) } return nil }) if err != nil { panic(fmt.Sprintf("遍历GCR失败:%v", err)) } }
补充说明
- 如果不需要递归遍历子仓库,可在回调函数中通过判断仓库路径的分隔符数量自行过滤一级仓库。
- 若遍历的仓库数量较多,可在WalkOptions中配置并发参数提升遍历效率。
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

