Artifactory中Docker Registry登录失败:返回Forbidden错误求助
Artifactory Docker Registry登录出现Forbidden(403)的解决办法
最近在把Artifactory配置成Docker Registry的时候踩了个坑——登录一直报Forbidden,折腾好一阵才搞定,把过程和解决方法分享给遇到同样问题的朋友:
问题场景
执行Docker登录命令:
docker login art.example.com
输入用户名和密码后,返回错误:
Username: xxxx Password: xxxx Error response from daemon: Get https://art.example.com/v2/: unknown: Forbidden
查看Artifactory日志,发现这条关键记录:
20180510195825|1|REQUEST|XX.XX.XX.XX|non_authenticated_user|GET|/api/docker/v2/|HTTP/1.1|403|0
日志显示请求用户是non_authenticated_user,说明要么认证信息没被正确传递,要么路由配置有问题导致Artifactory无法识别请求的认证身份。
解决方法(2019-01-09已验证解决)
问题根源在Nginx代理的配置上,需要调整路由规则,确保Docker的/v2/请求被正确转发到Artifactory的Docker API端点。修改后的完整Nginx配置如下:
(...) listen 443 ssl; (...) # Docker traffic # Redirect (most) requests to /v2/* to the Docker Registry location /v2/ { add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always; rewrite ^/(v2)/$ /api/docker/$1; rewrite ^/(v2)/([^\/]*)/(.*) /api/docker/$2/$1/$3; proxy_set_header Host $http_host; } # Artifactory traffic location / { rewrite ^/$ /artifactory/webapp/ redirect; rewrite ^/artifactory/?(/webapp)?$ /artifactory/webapp/ redirect; if ( $request_uri ~ ^/artifactory/(.*)$ ) { proxy_pass http://art.example.com:8081/artifactory/$1; } proxy_pass_header Server; proxy_pass http://art.example.com:8081/artifactory/; proxy_set_header Host $http_host; proxy_set_header X-Artifactory-Override-Base-Url $http_x_forwarded_proto://$host/artifactory; }
关键调整说明
- 单独为
/v2/路径配置路由,通过rewrite规则将Docker的v2请求映射到Artifactory的/api/docker/专属端点 - 确保
Host请求头正确传递,避免Artifactory因域名不匹配拒绝请求 - 保留Artifactory自身的请求路由规则,保证Web界面和其他API的正常访问
修改完成后重启Nginx服务,再次执行docker login art.example.com就能正常完成登录了。
内容的提问来源于stack exchange,提问作者Squirrel
相关产品推荐
相关产品推荐

