使用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
工作正常。
答案 0 :(得分:1)
我有一个私人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
答案 1 :(得分:1)
以下在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 }
})
答案 2 :(得分:0)
我认为您在编码中缺少两层。生成标题的实际代码(来自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':[auth entries数组]}的外部地图,所有json-then-base64编码。
答案 3 :(得分:0)
检查您的身份验证环境变量问题
docker login --username $USERNAME --password $PASSWORD --email $EMAIL_ADDRESS $SERVER_ADDRESS
如果它们是正确的,您将看到“登录成功”。
我怀疑$ NAMESPACE应匹配$ USERNAME。 尝试使用v1.13作为版本而不是v1。