英文:
How to extract list of docker images from GCP Container Registry?
问题
我想获取我在特定项目上上传的所有Docker镜像的列表。
我正在使用官方的SDK https://pkg.go.dev/cloud.google.com/go
。
根据我的理解,列表应该在container模块下。但是,我找不到任何名为ListImages或ListRepositories的方法可以实现这个目的。
我查看了artifactregistry模块,但似乎只有在我将镜像推送到artifact registry时才有用。
在golang中,获取Docker镜像(按项目分类)的正确方法是什么?
英文:
I want to get list of all the docker images that I have uploaded on a particular project.
I am using the official SDK https://pkg.go.dev/cloud.google.com/go
As per my understanding the listing should be under the container module. But, I am not able to find any method called ListImages OR ListRepositories that can server the purpose.
I checked out the artifactregistry module, but it seems that it is only useful in case I push my images to artifact registry.
What is the correct way to get listing of docker images (project wise), in golang ?
答案1
得分: 4
我不认为我们有一个用于containerregistry的客户端库。根据这个帖子,它只是根据Docker Registry API的实现。
你尝试过使用Registry包吗?https://pkg.go.dev/github.com/docker/docker/registry
对于仓库,你可以使用hostname/project-id的格式。其中,hostname可以是gcr.io、eu.gcr.io或us.gcr.io,具体取决于你在GCR中的仓库配置。
英文:
I don't think we have a client library for the containerregistry. Since it's just an implementation of the Docker Registry API according to this thread at least
Have you tried with the Registry package ? https://pkg.go.dev/github.com/docker/docker/registry
For the repository you can use hostname/project-id. Where hostname is gcr.io or eu.gcr.io or us.gcr.io depending on how your repositories in GCR are configured.
答案2
得分: 1
golang方法(在运行gcloud auth configure-docker
之后进行测试):
package main
import (
"context"
"fmt"
"log"
"github.com/google/go-containerregistry/pkg/authn"
gcr "github.com/google/go-containerregistry/pkg/name"
"github.com/google/go-containerregistry/pkg/v1/google"
"github.com/google/go-containerregistry/pkg/v1/remote"
)
func main() {
auth, err := google.NewGcloudAuthenticator()
if err != nil {
log.Fatal(err)
}
fmt.Println(auth)
registry, err := gcr.NewRegistry("gcr.io")
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
repos, err := remote.Catalog(ctx, registry, remote.WithAuthFromKeychain(authn.DefaultKeychain))
if err != nil {
log.Fatal(err)
}
for _, repo := range repos {
fmt.Println(repo)
}
}
响应:
&{0xc0000000}
project-id/imagename
REST API方法:
您可以像这样列出镜像(将gcr.io替换为您的gcr端点,例如gcr.io、us.gcr.io、asia.gcr.io等):
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://gcr.io/v2/_catalog"
响应:
{"repositories":["project-id/imagename"]}
您可以在此链接中找到有关令牌获取的一些相关详细信息:
https://stackoverflow.com/questions/44783736/how-to-list-images-and-tags-from-the-gcr-io-docker-registry-using-the-http-api
注意:如果您可以访问多个项目,则需要从响应中筛选出特定于项目的镜像。
英文:
golang approach (tested after running: gcloud auth configure-docker
):
package main
import (
"context"
"fmt"
"log"
"github.com/google/go-containerregistry/pkg/authn"
gcr "github.com/google/go-containerregistry/pkg/name"
"github.com/google/go-containerregistry/pkg/v1/google"
"github.com/google/go-containerregistry/pkg/v1/remote"
)
func main() {
auth, err := google.NewGcloudAuthenticator()
if err != nil {
log.Fatal(err)
}
fmt.Println(auth)
registry, err := gcr.NewRegistry("gcr.io")
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
repos, err := remote.Catalog(ctx, registry, remote.WithAuthFromKeychain(authn.DefaultKeychain))
if err != nil {
log.Fatal(err)
}
for _, repo := range repos {
fmt.Println(repo)
}
}
response:
&{0xc0000000}
project-id/imagename
REST API Approach:
you can list the images like this (replace the gcr.io with your gcr endpoint such as gcr.io, us.gcr.io, asia.gcr.io etc.):
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://gcr.io/v2/_catalog"
response:
{"repositories":["project-id/imagename"]}
you can find some related details regarding the token fetching from this link:
https://stackoverflow.com/questions/44783736/how-to-list-images-and-tags-from-the-gcr-io-docker-registry-using-the-http-api
PS: you will have to filter out the project specific images from response if you have access to multiple projects
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论