猿问

如何正确验证 docker 客户端 golang 库到 gcr.io 注册表?

我需要使用此包库以编程方式(使用 golang)登录 gcr.io docker 注册表https://godoc.org/github.com/docker/docker/client

我尝试过使用它,我可以成功登录,但是在将图像推送到我的 gcr.io 项目注册表时,它说

{"errorDetail":{"message":"unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication"},"error":"unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication"}

您可以看一下该CopyImage方法,其中 被option.DestRegistryAuth分配了输出gcloud auth print-access-token。用户名设置为“oauth2accesstoken”,因为我遵循了以下说明: https ://cloud.google.com/container-registry/docs/advanced-authentication

至于source参数,假设它来自公共注册表,如 docker.io/library/alpine:3.10,因此我们可以在不配置任何身份验证令牌的情况下提取它。但是对于dest参数,目前它是我的私人注册表中的图像,例如:asia.gcr.io/<gcp-project-id>/alpine:3.10

另外,gcloud auth print-access-token在我这样做之后调用,gcloud auth login并且我已经拥有访问我的私人 asia.gcr.io 注册表的完全权限(在存储桶级别分配)。

现在奇怪的是,我可以在此处描述docker push之后使用命令成功推送它https://cloud.google.com/container-registry/docs/advanced-authenticationdocker login

有什么建议吗?


慕容708150
浏览 145回答 1
1回答

喵喵时光机

事实证明,RegistryAuthtypes.ImagePush 选项中的 arg 需要一个 base64 编码字符串。因此,使用此代码,我可以成功地将本地映像推送到我的私有注册表。   authConfig := types.AuthConfig{        Username: "oauth2accesstoken",        Password: option.DestRegistryAuth,    }    encodedJSON, err := json.Marshal(authConfig)    if err != nil {        return fmt.Errorf("error when encoding authConfig. err: %v", err)    }    authStr := base64.URLEncoding.EncodeToString(encodedJSON)    rc, err = destClient.DockerClient.ImagePush(ctx, dest, types.ImagePushOptions{        RegistryAuth: authStr,    })
随时随地看视频慕课网APP

相关分类

Go
我要回答