cmliu / CF-Workers-docker.io

这个项目是一个基于 Cloudflare Workers 的 Docker 镜像代理工具。它能够中转对 Docker 官方镜像仓库的请求,解决一些访问限制和加速访问的问题。
https://docker.fxxk.dedyn.io
3.18k stars 3.39k forks source link

报错:error unmarshalling #21

Open hxz393 opened 2 weeks ago

hxz393 commented 2 weeks ago

拉取 Redis 镜像的时候会报错,百思不得解:

[root@k8s-239 ~]# docker pull docker.x2b.net/library/redis:7.0
Error response from daemon: error unmarshalling content: invalid character '<' looking for beginning of value

1.自建代理拉取其他镜像是正常的; 2.使用第三方代理 docker.m.daocloud.io 来拉取 redis 镜像也是正常的。

smallodd commented 2 weeks ago

俺也一样

Radddder commented 1 week ago

俺也一样

hxz393 commented 3 days 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 镜像会发生跳转,我再看看...

hxz393 commented 3 days ago

下面是使用 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"
hxz393 commented 3 days ago

原因找到了,是下面代码起了作用(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」中的项目页面,点击「设置」-「变量」-「全局变量」删除添加的自定义 URLURL302 变量,从此不会触发上面跳转逻辑。

至于根本原因是什么,我没搞懂。

JingBh commented 2 days ago

一样的问题,看了一下 148 行附近的代码,应该是这里

https://github.com/cmliu/CF-Workers-docker.io/blob/a38495f06f917ced6c22904f98e59ab7430da693/_worker.js#L132-L146

在匹配伪装路径的时候,redis 匹配到了 /r 这一条规则(135 行)。把这一行注释掉,就可以正常拉取 redis 镜像了