Docker镜像拉取错误:无效字符。

5

我试图从DTR拉取一个docker镜像,但是我遇到了以下错误

#docker pull repo/appname
Trying to pull repository  repo/appname ...
Pulling repository repo/appname
**invalid character '<' looking for beginning of value**

我不确定出了什么问题。我刚才谷歌搜索发现以下链接与错误有关,但没有帮助。

https://github.com/stripe/stripe-go/issues/642


你从Docker镜像仓库服务器处得到了一个非成功的HTTP响应。如果你生活在某个已经禁止访问该服务器的地方,就可能会发生这种情况,你将收到403错误码(这种情况发生在数百万试图访问Docker Hub的人身上)。否则,如果您输入了错误的镜像仓库URL,则可能会收到404错误码,或者如果镜像仓库服务器出现问题,则可能会收到5xx错误码。 - Ali Tou
大家好,问题是由于DTR中缺少图像导致的。该图像已被推送到我的组织中的另一个DTR,并且拉取是从不同的DTR进行的。因此,图像丢失了,这导致了上述错误。感谢大家的贡献。 - Stunner
5个回答

5

之前的回答指出可能是网络问题

对于访问DTR (Docker Trusted Registry)的情况,这也可能是权限问题。
例如,如果需要进行docker login才能访问该镜像,则会返回一个404 HTML页面,而docker命令将无法解析以<!DOCTYPE html>开头的HTML响应,因此会出现无效字符'<')

实际上,BMitch评论中有帮助地指出,DTR将会发送一个JSON消息,而不是HTML:

这个<来自请求到达注册表API之前的其他拦截器。

某些东西捕获了请求,在到达注册表API之前。网络代理或容器内的反向代理。
无论哪种方式,docker login都不应该有所帮助。

我会用curl命令访问注册表的URL/端口,看看是什么导致了错误。


403状态码是存储库API针对未授权请求的JSON响应。而这个“<”则是请求在到达存储库API之前被拦截处理所致。 - BMitch
@BMitch 好的,所以在客户端和互联网DTR之间有一些代理或其他中间服务器。 - VonC
@BMitch 我的 Nexus 3 也遇到了同样的问题,它作为 Docker 注册表、实际互联网 Docker 注册表的代理缓存。 - VonC
1
是的,在请求到达注册表API之前,有些东西正在捕获它。可能是网络代理或容器内的反向代理。无论哪种方式,docker login 都不会有帮助。我建议使用curl命令访问注册表的URL和端口,查看生成错误的原因。 - BMitch
@BMitch 很好的观点。我已经将您的评论包含在答案中以增加可见性。 - VonC

2

我的情况是因为在DTR中缺少图像。我不知道我们组织中有多个几乎相似(除了一些字符)的DTR。所以图像被推送到ABC DTR,但拉取操作正在查找XYZ DTR。因此我得到了上述错误信息。我现在能够成功地从正确的DTR中拉取图像。


感谢您的贡献。非常感谢您的回答。 - Stunner

0

我遇到了类似的问题,使用docker pull <image>命令时,但错误信息更加详细:

ERROR: error parsing HTTP 400 response body: invalid character '<' looking for beginning of value: "<html>\r\n<head><title>400 The SSL certificate error</title></head>\r\n<body>\r\n<center><h1>400 Bad Request</h1></center>\r\n<center>The SSL certificate error</center>\r\n<hr><center>openresty</center>\r\n</body>\r\n</html>\r\n"

我发现证书已经过期了 (/etc/docker/certs.d/<docker hostname>)1,所以我需要从 machine_public.pem 更新 client.cert,并从 machine_private.pem 更新 client.key(使用命令 cp <dir>/machine_(public|private).pem <dir>/client.(cert|key) ... 每个命令分别执行)。

1 https://docs.docker.com/engine/security/certificates/#:~:text=A%20custom%20certificate%20is%20configured,%2Fetc%2Fdocker%2Fcerts


0

我的问题是 Docker Desktop 版本过旧。更新后问题得到了解决。在加载 Docker Desktop 时,我也看到了一个“失败”的消息。


0
我们团队最近遇到了同样的问题,只是“无效字符”变成了“c”。
经过深入调查,我们的一位同事指出了与“buildkit”有关的一些问题https://docs.docker.com/build/buildkit/。为了测试它,需要停用守护进程中的“buildkit”,然后重新启动它,以确定是否仍然存在问题。在停用“buildkit”的情况下,一切正常运行。但我们希望保持“buildkit”的激活状态以提高性能,所以我们的最后一次尝试就是重置“Docker Desktop”。 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接