Docker加载并保存:“ archive / tar:无效的tar标头”

bic*_*ter 7 linux redhat tar docker docker-image

我正在尝试将Docker映像导入AWS Red Hat Linux(3.10.0-514.el7.x86_64)上的Docker中,并且出现错误问题;

Error processing tar file(exit status 1): archive/tar: invalid tar header
Run Code Online (Sandbox Code Playgroud)

相同的映像在我的本地计算机上运行良好,在Windows上的Boot2Docker中也运行良好。它非常大(2.5 GB),但是我已经在Red Hat Linux实例上验证了校验和,并且与源中的校验和相同。

有什么问题或如何解决?

小智 13

作为对 Ostecke 回答的更详细描述。

我发现这不是 Windows 特定的问题。这是一个powershell问题。Powershell 向 STDOUT 发出两个字节的字符,而不是一个字节的字符。如果您查看该文件,您会注意到 TAR 标头在正确的标头(以及文件的其余部分)之间有空值。这解释了为什么文件大小是原来的两倍。

另一方面,CMD 不会向 STDOUT 发出多字节字符。如果您在 Windows 上使用 CMD,我发现保存文件的 STDOUT 方法可以在不同的操作系统上正常工作。

使用 powershell,只有 -o 选项是安全的:

docker save [image] -o file.tar
Run Code Online (Sandbox Code Playgroud)

使用 CMD,任何一种方法都应该可以正常工作。


小智 12

我想补充一点,该问题可能是由于Windows和Unix之间的STDOUT行为不同而发生的。因此,使用STDOUT进行保存的方式如下:

docker save [image] > file.tar 其次是 docker load < file.tar

如果saveload在不同的操作系统上执行,将无法正常工作。始终使用:

docker save [image] -o file.tar 其次是 docker load -i file.tar

防止这些问题。比较通过不同方法生成的TAR文件,您会发现它们的大小完全不同(对于我来说,是303MB对614MB)。

  • 我一直试图弄清楚为什么我的图像整天都膨胀了 2 倍——就是这样。你是最棒的,每个人都爱你。 (5认同)

dan*_*004 4

解决这个问题的正确方法是这样的:

保存图像时,请使用此说明

Docker save --output=C:\YOUR_PATH\my_docker_image.tar e6f81ac424ae(image id)
Run Code Online (Sandbox Code Playgroud)

当您尝试加载此图像时,请使用以下指令:

Docker load --input C:\YOUR_PATH\my_docker_image.tar
Run Code Online (Sandbox Code Playgroud)

之后,您会在 Docker 映像中看到名称为 <none> 的映像,要解决此问题,请使用命令标记

Docker tag IMAGE_ID mydockerapplication
Run Code Online (Sandbox Code Playgroud)