Open hxz393 opened 2 weeks ago
俺也一样
俺也一样
通过在 CF 上追踪日志,我知道了报错说的是什么了:
正常请求 nginx
的镜像,发送 GET
请求到 https://docker.x2b.net/v2/library/nginx/manifests/latest
返回状态码 200
和 JSON 格式响应。
而请求 redis
的镜像,发送 GET
请求到 https://docker.x2b.net/v2/library/redis/manifests/latest
注意这里只有镜像名不一样,但是返回状态码 302
,然后跳转到一个页面(可能是自定义的主页)。这时按照 JSON 去解析返回的网页,遇到网页第一个标签 <html>
就报错了,因为 JSON 格式必须以 {
开头,这也是报错内容 error unmarshalling content: invalid character '<' looking for beginning of value
所表达的意思。
至于为什么请求 redis
镜像会发生跳转,我再看看...
下面是使用 curl
模拟拉取镜像,正常返回:
token=$(curl --silent "https://docker.x2b.net/token?service=registry.docker.io&scope=repository:library/nginx:pull" | jq -r .token)
curl --silent -H "Authorization: Bearer $token" "https://docker.x2b.net/v2/library/nginx/manifests/latest"
下面是拉取 redis
镜像,返回 302
:
token=$(curl --silent "https://docker.x2b.net/token?service=registry.docker.io&scope=repository:library/redis:pull" | jq -r .token)
curl -v -H "Authorization: Bearer $token" "https://docker.x2b.net/v2/library/redis/manifests/latest"
原因找到了,是下面代码起了作用(148 行):
if (env.URL302){
return Response.redirect(env.URL302, 302);
} else if (env.URL){
if (env.URL.toLowerCase() == 'nginx'){
//首页改成一个nginx伪装页
return new Response(await nginx(), {
headers: {
'Content-Type': 'text/html; charset=UTF-8',
},
});
} else return fetch(new Request(env.URL, request));
}
解决办法是,打开「Workers 和 Pages」中的项目页面,点击「设置」-「变量」-「全局变量」删除添加的自定义 URL
和 URL302
变量,从此不会触发上面跳转逻辑。
至于根本原因是什么,我没搞懂。
一样的问题,看了一下 148 行附近的代码,应该是这里
在匹配伪装路径的时候,redis
匹配到了 /r
这一条规则(135 行)。把这一行注释掉,就可以正常拉取 redis
镜像了
拉取 Redis 镜像的时候会报错,百思不得解:
1.自建代理拉取其他镜像是正常的; 2.使用第三方代理 docker.m.daocloud.io 来拉取 redis 镜像也是正常的。