对于以上问题,我的解决办法就是Nginx配置反代,用的时候启用,不用的时候关闭,省的被白嫖流量。
location /v2/ { proxy_pass https://registry-1.docker.io; # Docker Hub 的官方镜像仓库 proxy_set_header Host registry-1.docker.io; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 关闭缓存 proxy_buffering off; # 转发认证相关的头部 proxy_set_header Authorization $http_authorization; proxy_pass_header Authorization; # 重写 www-authenticate 头为你的反代地址 proxy_hide_header www-authenticate; #同理,如果你没域名的话,这里请填写IP地址 add_header www-authenticate 'Bearer realm="https://这里替换成你的域名或者IP/token",service="registry.docker.io"' always; # always 参数确保该头部在返回 401 错误时无论什么情况下都会被添加。 # 对 upstream 状态码检查,实现 error_page 错误重定向 proxy_intercept_errors on; # error_page 指令默认只检查了第一次后端返回的状态码,开启后可以跟随多次重定向。 recursive_error_pages on; # 根据状态码执行对应操作,以下为301、302、307状态码都会触发 error_page 301 302 307 = @handle_redirect; } location /token { resolver 8.8.8.8 valid=6000s; proxy_pass https://auth.docker.io; # Docker 认证服务器 # 设置请求头,确保转发正确 proxy_set_header Host auth.docker.io; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 传递 Authorization 头信息,获取 Token proxy_set_header Authorization $http_authorization; proxy_pass_header Authorization; # 禁用缓存 proxy_buffering off; } location @handle_redirect { resolver 8.8.8.8; set $saved_redirect_location '$upstream_http_location'; proxy_pass $saved_redirect_location; }