我使用Google容器注册表来托管我的泊坞窗图片。我也使用moby客户端来golang与之交互。我使用JSON service key approach似乎与RegistryLogin一起使用。响应文本是Login Successful。但是,我不知道如何使用ImagePull返回的身份验证密钥。在引擎盖设置下,RegistryAuth似乎设置了作为X-Registry-Auth标头传递的任何字符串,谷歌似乎没有在任何地方提到这一点。
我尝试将返回的密钥作为RegistryAuth传递,我尝试运行RegistryLogin,然后在没有RegistryAuth的情况下拉动。我已经尝试过base64编码我的auth配置并在RegistryAuth中发送它。无论我尝试什么,我都会得到#34;来自守护进程的错误响应:找不到存储库xxx:不存在或没有拉取访问权限#34;。运行docker登录然后使用相同的详细信息进行docker pull在cli上运行正常。我的代码是:
authConfig := types.AuthConfig{
Username: "_json_key",
Password: string(decodedKey),
ServerAddress: "https://gcr.io",
}
_, err = engine.Client.RegistryLogin(ctx, authConfig)
if err != nil {
return err
}
responseBody, err := engine.Client.ImagePull(ctx, image, types.ImagePullOptions{
})
defer responseBody.Close()
if err != nil {
return err
}
encodedKey是JSON密钥文件内容。任何想法如何让这个工作?
答案 0 :(得分:2)
(我假设您已经解决了这个问题,或者已经想出了另一种方法,但是我将在这里为下一个人记录下来)
您需要将其封送为JSON,然后进行base64编码。除了the code for the docker cli之外,我都没有看到此文档。
不幸的是,当我尝试包含github.com/docker/cli/cli/command
时,由于cli repo的供应商目录包含在go的包源路径中而导致出现此错误:
./gcp.go:73:47: cannot use authc (type "github.com/docker/docker/api/types".AuthConfig)
as type "github.com/docker/cli/vendor/github.com/docker/docker/api/types".AuthConfig
in argument to command.EncodeAuthToBase64
Go编译器无法识别它们是同一类型,这很烦人。但是复制功能非常简单:
buf, _ = json.Marshal(authConfig)
regauth := base64.URLEncoding.EncodeToString(buf)
pullopts := types.ImagePullOptions{RegistryAuth:regauth}
responseBody, err := engine.Client.ImagePull(ctx, image, pullopts)
...
*恕我直言,更好的实现方式是在pullopts中添加一个types.RequestPrivilegeFunc,以从access_token
即时获取http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
字段。这样一来,无需担心应用安全性。我自己还没有尝试过。
希望能有所帮助,尽管迟了18个月。 :)
FWIW,Google支持无法提供有关此的任何信息,并且gcr.io和docker文档也没有提供太多帮助。解决方案是先获取cli auth set up,然后入侵docker cli工具的自定义版本,以便我可以了解实际情况。
* EDIT :因此,我尝试了此操作,但从未调用过PullOptions中声明的PrivilegeFunc
函数。我不知道为什么。太糟糕了,这似乎是一种更干净的解决方案。上面的程序代码对我有用。