我正在尝试使用此 golang sdk 与 Google Artifact Registry 进行交互:https://google pkg.go.dev/cloud.google.com/go/artifactregistry/apiv1
似乎缺少很多文档和示例。
如何获取给定
artifactregistrypb
docker 镜像的清单数据(或清单文件下载 URL)?
import (
artifactregistry "cloud.google.com/go/artifactregistry/apiv1"
"cloud.google.com/go/artifactregistry/apiv1/artifactregistrypb"
...
)
func do(ctx context.Context) {
client, err := artifactregistry.NewClient(ctx)
if err != nil {
log.Fatal(err)
}
defer client.Close()
repoPath := fmt.Sprintf("projects/%s/locations/%s/repositories/%s", projectID, location, repo)
dockerImg := getDockerImage(ctx, client, repoPath)
// dockerImg is of type *artifactregistrypb.DockerImage
// get the manifest file corresponding to dockerImg
}
我可以使用一个
ListFiles
方法,但我不确定如何在dockerImg和相应的清单文件之间进行匹配。
我本质上寻找的是类似于 AWS GetDownloadUrlForLayer ECR API。
最终直接使用
github.com/containers/image/v5/docker
来获取图像blob,而不是使用SDK。
import(
artifactregistry "cloud.google.com/go/artifactregistry/apiv1"
"golang.org/x/oauth2/google"
dockeref "github.com/containers/image/v5/docker/reference"
imgtypes "github.com/containers/image/v5/types"
"github.com/containers/image/v5/docker"
)
func do(ctx context.Context) ([]byte, error) {
namedRef, err := dockeref.ParseDockerRef("us-west1-docker.pkg.dev/my-project/my-repo/image-name:latest")
if err != nil {
return nil, err
}
ref, err := docker.NewReference(namedRef)
if err != nil {
return nil, err
}
creds, err := google.FindDefaultCredentials(ctx, artifactregistry.DefaultAuthScopes()...)
if err != nil {
return nil, err
}
token, err := creds.TokenSource.Token()
if err != nil {
return nil, err
}
img, err := ref.NewImage(ctx, &imgtypes.SystemContext{
DockerBearerRegistryToken: token.AccessToken,
})
if err != nil {
return nil, err
}
return img.ConfigBlob(ctx)
}