首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google容器注册表golang moby身份验证

Google容器注册表golang moby身份验证
EN

Stack Overflow用户
提问于 2017-07-02 09:51:33
回答 1查看 913关注 0票数 6

我正在使用谷歌容器注册托管我的码头图像。我还使用moby客户端与golang进行交互。我正在使用JSON服务密钥方法,它似乎与RegistryLogin很好地工作。响应文本登录成功。但是,我不知道如何在ImagePull中使用返回的身份验证密钥。在遮罩设置下,RegistryAuth似乎设置了任何作为标题传递的字符串,谷歌似乎在任何地方都没有提到这一点。

我尝试将返回的密钥作为RegistryAuth传递,我尝试运行RegistryLogin,然后在不使用RegistryAuth的情况下拉动。我尝试过用base64编码我的auth配置,并在RegistryAuth中发送它。无论我如何尝试,我都会得到“来自守护进程的错误响应:存储库xxx未找到:不存在或没有拉动式访问”。运行码头登录,然后码头拉与相同的细节工作良好的cli。我的代码是:

代码语言:javascript
复制
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密钥文件内容。有什么办法让这件事起作用吗?

EN

回答 1

Stack Overflow用户

发布于 2018-12-31 03:53:42

(我猜想你已经想好了,或者已经想出了另一种方法,但我会在这里为下一个人记录它)

您需要将其封送到JSON,然后base64对其进行编码。除了停靠者cli的代码之外,我还没有看到过这种文档。

不幸的是,当我试图包含github.com/docker/cli/cli/command时,由于cli的供应商目录被包含在go的包源路径中,我得到了这个错误:

代码语言:javascript
复制
./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编译器不认识到它们是相同的类型,这是很烦人的。但是它很简单,可以复制这个功能:

代码语言:javascript
复制
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函数从未被调用。我不知道为什么。不幸的是,这似乎是一个更清洁的解决方案。不过,上面的程序代码对我有用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44869498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档