7

使用REST API将 Docker 映像推送到私有注册表时,X-Registry-Auth 标头的内容应该是什么?根据Using Docker API to push to private registry,需要一个 X-Registry-Auth 标头。https://groups.google.com/forum/#!topic/docker-user/vXcA8fsCNZM建议该值应该是格式为 base64 编码的 JSON 字符串:

{'username': string, 'password': string, 'email': string, 'serveraddress' : string}

设置合适的环境变量后,我做了:

XRA=`echo "{\"username\": \"${USERNAME}\", \"password\": \"${PASSWORD}\", \"email\": \"${EMAIL_ADDRESS}\", \"serveraddress\" : \"${SERVER_ADDRESS}\"}" | base64 --wrap=0`
curl  -v --request POST --header "X-Registry-Auth: $XRA" http://$DOCKER_HOST/v1/images/$REGISTRY/$NAMESPACE/$REPOSITORY?tag=$TAG

并得到403 Forbidden回应。

也许问题只是我不知道值应该是什么。我怎样才能确定它们?Docker 似乎有办法;sudo docker push $REGISTRY/$NAMESPACE/$REPOSITORY:$TAG工作得很好。

4

4 回答 4

5

我有一个私人 nexus docker repo (Docker Api v2),对我来说,这就是解决方案:

 XRA=`echo "{ \"username\": \"yourname\", \"password\": \"yourpass\", \"email\": \"youmail@example.org\" }" | base64 --wrap=0`
 curl  -X POST  -d "" -H "X-Registry-Auth: $XRA" http://localhost:4243/images/create?fromImage=private.host:19003/imagename&tag=latest
于 2016-11-18T12:21:31.497 回答
3

以下在 node.js 中对我有用(经过数小时的令人沮丧的试验......):

var authInfo2 = `{\"username\": \"${user}\", \"password\": \"${passwd}\", \"email\": \"${email}\", \"serveraddress\": \"${registry}\"}`

var authInfo = Buffer.from(authInfo2).toString('base64')

var result = await fetch(url, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-Registry-Auth' : authInfo }
})
于 2018-06-08T07:20:54.980 回答
1

我认为您在编码中缺少两层。生成标头的实际代码(来自github

def encode_header(auth):
    auth_json = json.dumps(auth).encode('ascii')
    return base64.b64encode(auth_json)

def encode_full_header(auth):
    """ Returns the given auth block encoded for the X-Registry-Config header.
    """
    return encode_header({'configs': auth})

所以你需要一个 {'configs': [array of auth entries]} 的外部映射,所有 json-then-base64 编码。

于 2014-08-29T19:41:42.047 回答
1

检查您的身份验证环境变量问题

docker login --username $USERNAME --password $PASSWORD --email $EMAIL_ADDRESS $SERVER_ADDRESS

如果它们是正确的,您将看到“登录成功”。

我怀疑 $NAMESPACE 应该匹配 $USERNAME。尝试使用 v1.13 作为版本而不是 v1。

于 2014-09-19T19:50:48.960 回答