Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

报错:error unmarshalling #21

Open
hxz393 opened this issue Jul 9, 2024 · 8 comments
Open

报错:error unmarshalling #21

hxz393 opened this issue Jul 9, 2024 · 8 comments

Comments

@hxz393
Copy link

hxz393 commented Jul 9, 2024

拉取 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
Copy link

俺也一样

1 similar comment
@Radddder
Copy link

俺也一样

@hxz393
Copy link
Author

hxz393 commented Jul 23, 2024

通过在 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
Copy link
Author

hxz393 commented Jul 23, 2024

下面是使用 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
Copy link
Author

hxz393 commented Jul 23, 2024

原因找到了,是下面代码起了作用(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
Copy link

JingBh commented Jul 24, 2024

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

const conditions = [
isUuid,
pathname.includes('/_'),
pathname.includes('/r'),
pathname.includes('/v2/user'),
pathname.includes('/v2/orgs'),
pathname.includes('/v2/_catalog'),
pathname.includes('/v2/categories'),
pathname.includes('/v2/feature-flags'),
pathname.includes('search'),
pathname.includes('source'),
pathname === '/',
pathname === '/favicon.ico',
pathname === '/auth/profile',
];

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

@smallodd
Copy link

smallodd commented Aug 14, 2024

大致看了下 疑似是伪装nginx部分代码导致 访问https://dockerhubs.xyz/v2/library/redis/manifests/latest 获取manifests信息时会跳转到伪装界面,在 大概 148行的判断处

if (conditions.some(condition => condition) && (fakePage === true || hostTop == 'docker')) {

加上一个条件, && !pathname.startsWith('/v2/library/') 确保 /v2/library/ 这种路径不会被错误处理,可使用docker pull xxxx.com/library/redis 正常拉取redis,至于加上这个条件有啥影响目前还不清楚

@StoneForests
Copy link

原因找到了,是下面代码起了作用(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 变量,从此不会触发上面跳转逻辑。

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

我也是今天拉取registry:2的时候报错,跟踪错误发现也是上述部分不停地跳302,后面取消环境变量后就OK了。但是取消302的话网址就直接暴露到公网上了,从日志中可以看到很多全球IP在用我的域名访问dockerhub,感觉流量扛不住啊

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants