Docker拉取“unexpected EOF”

24

我在使用Docker时遇到了问题。 情况是这样的:我们使用Codebuild+Packer+Docker创建AMI,用于部署。在这个步骤中,我们从Artifactory拉取镜像,除了拉取一个大于1GB的层之外,所有步骤都通过了。经过多次重试后,它仍然失败并显示错误消息:“Download failed, retrying: unknown blob”,然后出现“unexpected EOF”。您有没有遇到过这样的问题?非常感谢任何评论或建议。


可能是代理或负载均衡器问题,它可能会阻止大文件下载。您能否直接连接到Artifactory而不通过代理?也许通过直接ssh到Artifactory服务器或同一网络上的服务器? - Robin Green
1
我以前遇到过类似的问题,特别是在处理非常大的单独层面时。除了一些通用的构建较小镜像的提示,例如"不要apt-get install build-essential",我没有具体的建议可以提供。 - David Maze
Docker 的哪个版本? - BMitch
1
@DavidMaze,是的,确实是这样解决了这个问题。谢谢! - Natalia Pakhol
如果您的问题不是与连接、大文件或artifactory有关,而是与Docker注册表有关,请查看此答案 - x-yuri
我也遇到了同样的问题,这是因为我们的Nginx代理机器空间不足。在我们进行清理后,问题得到了解决。 - Navin prasad
8个回答

18

这主要是由于网络信号不稳定 ( 因为我使用的是移动热点 )

配置了 docker 守护进程 以减少 tcp 数据包

$ dockerd --max-concurrent-downloads <int>  

这里的<int>表示您想同时下载的docker pull层数量。
默认值为3

在我的情况下,我将其设置为2

$ dockerd --max-concurrent-downloads 2 &>/dev/null  

这样做的缺点是牺牲了你宝贵的时间 :)
需要花费很长时间


8
我曾经遇到一个很小的层次在注册表 V2 中出现了损坏或破碎,原因不明。在重试该层次(在这个例子中标识为“1f8fd317c5a4”)后,“docker pull”失败并显示“unexpected EOF”。
从源代码重新构建镜像并尝试“docker push”时,会显示“layer already exists”,但并没有解决问题。
我通过以下命令使用“curl”删除了有问题的层次: curl -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' -sk "https://registry.local/v2/image-name/manifests/1033-develop-7e414712" (将 "registry.local" 替换为您的注册表,将 "image-name" 替换为您的镜像名称,将 "1033-develop-7e414712" 或您的镜像标签替换为 "latest"。)
从 JSON 输出中获取层次 1f8fd317c5a4 的完整 sha256 摘要,并在下一个命令中使用它: curl -k -X DELETE "https://registry.local/v2/image-name/blobs/sha256:1f8fd317c5a406a75130dacddc02bd09a9abf44e068e2730dd8f5238666bb390" 现在,您就可以上传您删除的层次并使一切正常,命令如下: docker push registry.local/image-name:1033-develop-7e414712

不确定这种方法是否适用于Artifactory。我没有看到那个标签。 - retrospectacus
我尝试了那种方法,但是尽管成功删除了有问题的图层并重新推送它们,但在再次尝试拉取后仍然会出现相同的错误.. :/ - gst
在再次推送之前,@gst请先本地重新构建图像。 - retrospectacus
我已经按照您的解决方案进行了操作,并删除了一些层,但其中一个仍然存在。我正在使用Jenkins构建图像并将它们推送到私有Docker注册表中。图像已成功构建和推送,但在尝试拉取它们时失败。请问我该如何更详细地调试这个问题? - Mehdi Khlifi
对我来说那没有帮助。我遇到了“未知 blob”错误,被迫重新构建镜像,这解决了我的问题。 - demmonico

7

在Windows上使用Docker Desktop时,找不到dockerd命令,然后在daemon.json文件中添加以下条目并重新启动docker服务。

"max-concurrent-downloads": 1

你可以在路径下找到这个文件-C:\Users\<user-name>\.docker\daemon.json
由于以顺序方式获取层,因此需要时间,但是这是一个在弱网络连接下载大型镜像文件的替代方案。

这是一个对于 Windows 用户有效的答案,因为他们没有 dockerd 命令。 - Brylie Christopher Oxley

6
由于连接不良,出现了相同的问题。在文档中,这是 dockerd 命令
对于Linux,只需添加:
$ dockerd --max-concurrent-downloads 2
$ dockerd --max-download-attempts 10

对于 Windows Docker Desktop,请打开“设置”->“Docker 引擎”,并将以下内容与适合您的数字一起弹出。 您可以在上述文档中查看所有选项。

enter image description here


2
  1. 停止docker服务:sudo service docker stop

  2. 使用降低的max-concurrent-downloads和增加的max-download-attempts运行docker服务,以适应您的互联网带宽(对我来说,不幸的是只能设置为1):sudo dockerd --max-concurrent-downloads 1 --max-download-attempts 10

注:我不是docker专家。但是,我相信通过向注册表或您的docker客户端添加一些配置,有更好的方法来完成此操作。


0
问题:无法拉取Docker镜像,一直在重试并出现EOF错误。 解决方案:更新Docker软件,然后尝试拉取镜像,这将解决该问题。

0
经过这么多尝试,以下是对我有效的方法:
  1. 删除容器注册表仓库中的图像。
  2. 使用 --no-cache 选项重新构建图像,并再次推送到容器注册表仓库。 docker build --no-cache -t

0

这并不完全符合 OP 描述的情况,但我会在此发布以供将来参考。Docker Desktop 4.15.0 引入了一个错误,导致我遇到了类似的问题。根据使用的 Docker Desktop 版本和命令,其中之一的错误会弹出:

% docker pull alpine:3.7
Error response from daemon: Get "https://registry-1.docker.io/v2/": read tcp 192.168.65.4:55694->192.168.65.5:3128: read: connection reset by peer

% docker-compose up --build
// Some stuff
 => ERROR [container_name internal] load metadata for docker.io/library/alpine:3.7                                                                           0.0s
------
 > [container_name internal] load metadata for docker.io/library/alpine:3.7:
------
failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to do request: Head "https://registry-1.docker.io/v2/library/alpine/manifests/3.7": unexpected EOF

% docker pull alpine:3.7
Error response from daemon: Get "https://registry-1.docker.io/v2/": unexpected EOF

解决方案是卸载Docker Desktop安装旧版本。我在这里发布这篇文章,因为很多指南和说明建议将Docker Desktop更新到最新版本,但在我的情况下,这正是导致问题的原因。当然,这个bug很可能会在某个时候被修补,我已经通知了Docker支持团队。
编辑:看起来我的问题有一个GitHub主题。

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