【问题标题】:Docker load and save: "archive/tar: invalid tar header"Docker 加载和保存:“存档/tar:无效的 tar 标头”
【发布时间】:2017-03-30 01:30:34
【问题描述】:

我正在尝试将 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

这个相同的图像在我的本地机器上运行良好,在 Windows 上的 Boot2Docker 中也可以。它相当大(2.5 GB),但我已经在 Red Hat Linux 实例上验证了校验和,它与源代码相同。

可能出了什么问题,或者我该如何解决?

【问题讨论】:

  • 您是否尝试过将其推送到注册表并将其拉到 Red Hat 盒子上?您可以在 Docker Hub 上免费存储一张图像,以便您试用。如果可行,请提供重现问题所需的最少步骤,包括构建映像的方式(以及在什么系统上)。

标签: linux docker redhat tar docker-image


【解决方案1】:

我想补充一点,这个问题可能是由于 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 倍——就是这样。你是最棒的,每个人都爱你。
【解决方案2】:

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

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

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

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

docker save [image] -o file.tar

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

【讨论】:

  • 没错,使用 CMD 而不是 PowerShell,同时将 -o 用于保存和 -i 用于加载对我有用 :) 谢谢!
【解决方案3】:

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

当你保存图片时,使用这个指令

Docker save --output=C:\YOUR_PATH\my_docker_image.tar e6f81ac424ae(image id)

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

Docker load --input C:\YOUR_PATH\my_docker_image.tar

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

Docker tag IMAGE_ID mydockerapplication

【讨论】:

    【解决方案4】:

    问题在于将 TAR 文件通过 FTP 传输到我的 AWS 实例 - FTP 客户端默认为 ASCII 模式而不是二进制。将其设置为二进制后,导入存档就没有问题了。

    【讨论】:

    • 你不能使用 HTTP 传输而不是 FTP 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多