谷歌容器注册表golang moby身份验证

时间:2017-07-02 09:51:33

标签: docker go moby

我使用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密钥文件内容。任何想法如何让这个工作?

1 个答案:

答案 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函数。我不知道为什么。太糟糕了,这似乎是一种更干净的解决方案。上面的程序代码对我有用。