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

标签 docker go moby

我正在使用 google 容器注册表来托管我的 docker 镜像。我也在使用 golang 的 moby 客户端与之交互。我正在使用 JSON service key approach这似乎适用于 RegistryLogin。响应文本是登录成功。但是,我不知道如何将返回的身份验证 key 与 ImagePull 一起使用。在后台设置 RegistryAuth 似乎设置了作为 X-Registry-Auth header 传递的任何字符串,Google 似乎没有在任何地方提及这一点。

我尝试将返回的 key 作为 RegistryAuth 传递,我尝试运行 RegistryLogin,然后在没有 RegistryAuth 的情况下进行拉取。我已经尝试过 base64 编码我的身份验证配置并将其发送到 RegistryAuth。无论我尝试什么,我都会收到“来自守护进程的错误响应:找不到存储库 xxx:不存在或没有拉取访问权限”。运行 docker login 然后 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
}

decodedKey 是 JSON key 文件内容。任何想法如何让它发挥作用?

最佳答案

(我假设您已经想通了,或者已经想出了另一种方法,但我会在这里为下一个人记录下来)

您需要将其编码为 JSON,然后对其进行 base64 编码。除了 the code for the docker cli 之外,我在任何地方都没有看到此文档。 .

不幸的是,当我尝试包含 github.com/docker/cli/cli/command 时,由于 cli repo 的 vendor 目录被包含在 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)

...

*恕我直言,更好的实现是拥有 types.RequestPrivilegeFunc在从 http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token 获取 access_token 字段的 pullopts 中。这样就无需担心应用程序凭据的安全性。我自己还没试过。

希望这会有所帮助,尽管晚了 18 个月。 :)

FWIW,Google 支持无法提供关于此的任何信息,gcr.io 和 docker 文档也没有提供太多信息。解决方案是获取 cli auth set up然后破解 docker cli 工具的自定义版本,这样我就可以看到真正发生了什么。

*EDIT:所以我尝试了这个,但是在 PullOptions 中声明的 PrivilegeFunc 函数永远不会被调用。我不知道为什么。太糟糕了,这似乎是一个更清洁的解决方案。不过,上面的程序代码对我有用。

关于docker - 谷歌容器注册 golang moby 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44869498/

相关文章:

postgresql - 运行两个 docker postgres 服务

mysql - 如何在 kubernetes 中禁用 mysql 严格模式?

regex - 去正则表达式解析字符串到环境变量

go - 在 golang 中将变量传递给测试用例的惯用方法

node.js - 使用 Promise 时如何从 dockerode 捕获标准输出?

docker - 不允许从 docker 容器到内部网络的流量

go - 文件在应用程序中附加而不覆盖

docker - 如何使用 docker go-lang API 的 TaskLogs 端点?

azure - 在 CentOS 7 上安装 docker-ce 时 moby 软件包出现问题