web-dev-qa-db-ja.com

Dockerのロードと保存:「archive / tar:無効なtarヘッダー」

AWS Red Hat Linux(3.10.0-514.el7.x86_64)のDockerにDockerイメージをインポートしようとしていますが、エラーで問題があります。

Error processing tar file(exit status 1): archive/tar: invalid tar header

この同じイメージは、ローカルマシンで正常に機能し、WindowsのBoot2Dockerでも正常に機能します。非常に大きい(2.5 GB)が、Red Hat Linuxインスタンスでチェックサムを確認しましたが、ソースと同じです。

何が問題になっているのでしょうか、またはどうすれば解決できますか?

11
bicster

WindowsとUnix間のSTDOUTの動作の違いが原因で問題が発生する可能性があることを付け加えておきます。したがって、次のようなSTDOUTの保存方法を使用します。

docker save [image] > file.tar に続く docker load < file.tar

saveloadが異なるOSで実行されている場合は機能しません。常に使用:

docker save [image] -o file.tar に続く docker load -i file.tar

これらの問題を防ぐために。さまざまな方法で生成されたTARファイルを比較すると、サイズが完全に異なることがわかります(私にとっては614MBに対して303MB)。

12
Ostecke

オステッケの答えのより詳細な説明として。

Windows固有の問題ではないことがわかりました。これはPowerShellの問題です。 Powershellは、1バイト文字ではなく、2バイト文字をSTDOUTに送信します。ファイルを見ると、正しいヘッダー(およびファイルの残りの部分)の間にTARヘッダーがnullであることがわかります。これは、ファイルのサイズが2倍になる理由を説明しています。

一方、CMDはマルチバイト文字をSTDOUTに送信しません。 WindowsでCMDを使用している場合、ファイルを保存するSTDOUTメソッドがさまざまなOSで正常に機能することがわかりました。

Powershellを使用する場合、安全なのは-oオプションのみです。

docker save [image] -o file.tar

CMDを使用すると、どちらの方法でも問題なく機能するはずです。

2

この問題を解決する正しい方法は次のとおりです。

画像を保存するときは、この手順を使用します

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

そして、この画像を読み込もうとするときは、次の命令を使用します。

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

この後、Dockerイメージに<none>という名前のイメージが表示されます。これを解決するには、コマンドタグを使用します

Docker tag IMAGE_ID mydockerapplication
1
daniele3004

TARファイルをAWSインスタンスにFTPで転送する際に問題が発生しました-FTPクライアントのデフォルトは、バイナリではなくASCIIモードです。バイナリに設定すると、アーカイブのインポートに問題はありませんでした。

1
bicster