我正在使用谷歌容器注册托管我的码头图像。我还使用moby客户端与golang进行交互。我正在使用JSON服务密钥方法,它似乎与RegistryLogin很好地工作。响应文本登录成功。但是,我不知道如何在ImagePull中使用返回的身份验证密钥。在遮罩设置下,RegistryAuth似乎设置了任何作为标题传递的字符串,谷歌似乎在任何地方都没有提到这一点。
我尝试将返回的密钥作为RegistryAuth传递,我尝试运行RegistryLogin,然后在不使用RegistryAuth的情况下拉动。我尝试过用base64编码我的auth配置,并在RegistryAuth中发送它。无论我如何尝试,我都会得到“来自守护进程的错误响应:存储库xxx未找到:不存在或没有拉动式访问”。运行码头登录,然后码头拉与相同的细节工作良好的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
}decodedKey是JSON密钥文件内容。有什么办法让这件事起作用吗?
发布于 2018-12-31 03:53:42
(我猜想你已经想好了,或者已经想出了另一种方法,但我会在这里为下一个人记录它)
您需要将其封送到JSON,然后base64对其进行编码。除了停靠者cli的代码之外,我还没有看到过这种文档。
不幸的是,当我试图包含github.com/docker/cli/cli/command时,由于cli的供应商目录被包含在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.EncodeAuthToBase64Go编译器不认识到它们是相同的类型,这是很烦人的。但是它很简单,可以复制这个功能:
buf, _ = json.Marshal(authConfig)
regauth := base64.URLEncoding.EncodeToString(buf)
pullopts := types.ImagePullOptions{RegistryAuth:regauth}
responseBody, err := engine.Client.ImagePull(ctx, image, pullopts)
...*IMHO,一个更好的实现是在脉冲中有一个types.RequestPrivilegeFunc,它可以动态地从http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token获取access_token字段。这样就不需要担心应用程序的安全了。我自己还没试过呢。
希望这会有所帮助,尽管已经晚了18个月。:)
FWIW,谷歌的支持无法提供有关这方面的任何信息,gcr.io和码头文档也没有提供太多的内容。解决方案是获取cli自设,然后侵入一个定制版本的docker工具,这样我就可以了解到底发生了什么。
*编辑:所以我尝试了这一点,但是在PullOptions中声明的PrivilegeFunc函数从未被调用。我不知道为什么。不幸的是,这似乎是一个更清洁的解决方案。不过,上面的程序代码对我有用。
https://stackoverflow.com/questions/44869498
复制相似问题