1

在谷歌云容器注册表的高级身份验证方法文档中,解释了一种使用带有 docker cli 的 JSON 密钥文件登录注册表的方法,这很好用

$ docker login -u _json_key -p "$(cat keyfile.json)" https://gcr.io

但是我正在尝试使用相同的 keyfile.json 文件使用 golangdocker/engine-api库登录注册表,我有一些工作代码,这似乎可以很好地验证其他注册表,但始终提供具有以下结构的文件

{
  "auths": {
    "cr.whatever.com": {
      "password": "PASSWORD",
      "username": "registry"
    }
  }
}

通过将该Unmarshal文件传递到ImageBuildOptions函数here然后在此处使用

但是,在使用keyfile.json或工作时不起作用config.json...

docker 文档指出,应使用带有用户名和密码的 JSON base64 编码对象,如Header Parameters 部分所述。

我已经尝试了多种选项来生成一个可以成功使用到 dockerX-Registry-Config标头中的文件,而没有太多运气......

任何帮助/提示将不胜感激。

谢谢!

4

2 回答 2

2

感谢您的帮助jsand,我终于起草了一个工作代码功能如下

func (d *DockerEngineClient) BuildImage(archive, modelId string, authConfigs map[string]types.AuthConfig) (types.ImageBuildResponse, error) {
    buildContext, err := os.Open(archive)
    defer buildContext.Close()

    c, err := ioutil.ReadFile(os.Getenv("GOOGLE_APPLICATION_CREDENTIALS_FILE"))
    if err != nil {
        return err
    }

    var authConfigs2 map[string]types.AuthConfig
    authConfigs2 = make(map[string]types.AuthConfig)

    authConfigs2["gcr.io"] = types.AuthConfig{
        Username: "_json_key",
        Password: string(c),
        ServerAddress: fmt.Sprintf("https://%s", d.remoteRegistryPrefix),
    }

    buildOptions := types.ImageBuildOptions{
        Tags:        []string{fmt.Sprintf("%s/%s", d.remoteRegistryPrefix, modelId)},
        AuthConfigs: authConfigs2,
    }

    var buildResponse types.ImageBuildResponse

    buildResponse, err = d.client.ImageBuild(context.TODO(), buildContext, buildOptions)
    if err != nil {
        return buildResponse, err
    }

    b, _ := ioutil.ReadAll(buildResponse.Body)
    fmt.Printf("%s\n", b)
    buildResponse.Body.Close()

    return buildResponse, err
}
于 2017-12-07T16:19:32.613 回答
1

我认为问题在于“配置”是一个超载的术语。看起来X-Registry-Config包含了 options.AuthConfigs 的 JSON 编码值的 base64 编码版本,而不是完整的 docker 配置文件。如果您只想验证https://gcr.io,您的 JSON 输入应该是:

{
  "gcr.io": {
    "username": "_json_key",
    "password": "{contents of keyfile.json}"
  }
}

或者,如果您愿意使用 Docker 的 golang 库:

import (
    "encoding/base64"
    "encoding/json"
    "net/http"

    "github.com/docker/engine-api/types"
)

def addDockerAuthsHeader(keyfile_contents string, headers http.Header) error {
    authConfigs := map[string]types.AuthConfig{
        "gcr.io": {
            Username: "_json_key",
            Password: keyfile_contents
        }
    }

    buf, err := json.Marshal(authConfigs)
    if err != nil {
        return err
    }

    headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf))

    return nil
}

生成keyfile_contents留给读者作为练习:)

于 2017-12-06T22:56:43.427 回答