我正在尝试在两台机器之间传输 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.tar
image.tar
USB 上进行了测试,没有 - 我几乎每天都会用到这个 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/docker
(rm -rf /var/lib/docker
这将删除所有容器、图像、卷,因此请备份您需要的内容),然后重新启动 docker ( systemctl start docker
)。您需要再次下载基础图像并重新运行构建(希望从 Dockerfile 中)。
如果可能的话,我会考虑使用注册服务器而不是 USB 来传输图像。您可以从registry:2
docker 映像运行自己的。
答案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
。我猜在复制过程中修改了某些内容。尝试保存并再次加载,可能是磁盘问题之类的。