我遇到了码头工人的问题。 场景是这样的:我们使用Codebuild + Packer + docker创建AMI,并将其用于部署。在此步骤中,我们从工件中拉出图像,除了拉出其中一层> 1Gb的层以外,其他所有过程都通过。重试几次后,失败并出现错误:下载失败,重试:未知Blob,然后出现“意外的EOF”。您曾经遇到过这样的问题吗?任何意见或建议都将受到高度赞赏。
答案 0 :(得分:1)
这主要是由于网络薄弱(因为我使用的是移动热点)
配置 docker守护程序以减少 tcp数据包
$ dockerd --max-concurrent-downloads <int>
此处
默认值为3
在我的情况下,我设置为2
$ dockerd --max-concurrent-downloads 2 &>/dev/null
这样做的缺点是牺牲了宝贵的时间:)
花时间像地狱一样
答案 1 :(得分:0)
我遇到了一个非常小的层的问题,该层由于某些未知原因而在注册表V2中损坏或损坏。重试图层后,docker pull
失败并显示“意外的EOF”(在这种情况下,标识为“ 1f8fd317c5a4”。)
从源头重建图像并尝试docker push
说“图层已存在”,而不是解决问题。
我能够使用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”,并将图像标签或“ latest”替换为“ 1033-develop-7e414712”。)
从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
上传已删除的图层,一切正常。
答案 2 :(得分:0)
1- 停止 docker 服务:
$ sudo service docker stop
2- 运行 docker 服务,将 max-concurrent-downloads
减少到适合您的互联网带宽(不幸的是我是 1)并增加 max-download-attempts
:
$ sudo dockerd --max-concurrent-downloads 1 --max-download-attempts 10
PS:我不是 Docker 专家。但是,我相信有一种更好的方法可以通过向注册表或 docker 客户端添加一些配置来实现。
答案 3 :(得分:0)
在 Windows 上使用 Docker Desktop,找不到 dockerd
命令,然后在 daemon.json
文件中添加以下条目并重新启动 docker 服务。
"max-concurrent-downloads": 1
您将在路径 C:\Users\<user-name>\.docker\daemon.json
中找到此文件。
这将按顺序拉取图层,因此需要时间,但是是的,这是通过弱网络连接下载大图像文件的替代解决方案。
答案 4 :(得分:-1)
伙计们请注意,docker文件(Dockerfile)不得使用.txt扩展名,并且编码类型必须为UTF-8,否则它将无法创建映像。