调查

调查

我正在尝试在两台机器之间传输 docker 镜像:

  • 机器 1
    • Ubuntu 16.04
    • docker 17.06.2
  • 机器 2
    • Ubuntu 18.10
    • docker 18.03.1

这是我做的:

-机器 1:

docker save -o /path/to/usb/image.tar image

-USB 记忆棒从机器 1 传输到机器 2

-机器2:

$ docker load -i /path/to/usb/image.tar
36018b5e9787: Loading layer [==================================================>]  200.1MB/200.1MB
invalid diffID for layer 0: expected "sha256:36018b5e978717a047892794aebab513ba6856dbe1bdfeb478ca1219df2c7e9c", got "sha256:a81b174512918f17d0735e6c32075c2437c22fac6b13c1d20c92449406f66bcd"

有人可以解释一下这个吗?

调查

这可能是我的 USB 驱动器的问题,但是:

  • 我试了两次,所以我怀疑这是由于复制错误
  • 我在机器 1 上diff进行了image.tarimage.tarUSB 上进行了测试,没有
  • 我几乎每天都会用到这个 U 盘,它运行良好

此外,将图像档案复制到 USB 记忆棒上后,我可以将其重新加载到机器 1 上。


最后,我尝试通过从 stdin 而不是从文件读取来执行 docker load,但仍然没有成功:

$ cat /path/to/usb/image.tar | docker load
invalid diffID for layer 0: expected "sha256:36018b5e978717a047892794aebab513ba6856dbe1bdfeb478ca1219df2c7e9c", got "sha256:a81b174512918f17d0735e6c32075c2437c22fac6b13c1d20c92449406f66bcd"

它可以与机器 3、ubuntu 16.04、docker 18.05.0 配合使用。


我在机器 1 上升级到 docker 18.06.0,但仍然没有成功。

答案1

diffID 错误来自于将 tar 文件中附带的清单与 docker 尝试导入的层 tar 文件的实际字节摘要进行比较。

需要注意以下几点:

检查是否有修改导出的 tar 文件本身的内容,例如是否有将文件视为 ascii 文本并修改行尾的内容。您可以尝试在传输文件之前使用 zip 或 gzip 压缩文件,这可以防止或至少揭示传输过程中的损坏。

磁盘空间不足导致部分写入。如果目录中的磁盘空间不足/var/lib/docker,您会收到来自 docker 的错误。这种情况可能会发生(许多安装默认将其设置为与磁盘相同/,并且不会分配太多磁盘空间)。

源上的 docker 的 overlay2 文件系统损坏。如果发生这种情况,我的直觉是重新开始:停止 docker ( systemctl stop docker),完全删除/var/lib/dockerrm -rf /var/lib/docker这将删除所有容器、图像、卷,因此请备份您需要的内容),然后重新启动 docker ( systemctl start docker)。您需要再次下载基础图像并重新运行构建(希望从 Dockerfile 中)。

如果可能的话,我会考虑使用注册服务器而不是 USB 来传输图像。您可以从registry:2docker 映像运行自己的。

答案2

听起来您的系统上的 diffID 可能不匹配。这些层具有与其关联的 UID,该 UID 存储在多个位置,其中两个位置是:

var/lib/docker/image/overlay2/distribution/v2metadata-by-diffid var/lib/docker/image/overlay2/distribution/diffid-by-digest

这些存储了 diffid 的 SHA256。我不确定这些位置是否用于导致错误的检查,但可能值得调查引发错误的 diffID 或哈希值

答案3

如果您提取图像 tar,您将看到目录中的每一层,其中layer.tar存在 a。这就是每一层的内容。diffID 来自sha256sum layer.tar。我猜在复制过程中修改了某些内容。尝试保存并再次加载,可能是磁盘问题之类的。

相关内容