Dockerイメージからファイルを抽出しますか?

Dockerイメージからファイルを抽出しますか?

イメージを実行せずにDockerイメージからファイルを抽出したいです。

このdocker saveオプションは、特定のファイルを解凍するには大きすぎるファイルを保存するため、現在私にとっては実行可能なオプションではありません。

答え1

次のコマンドを使用して、イメージからファイルを抽出できます。

container_id=$(docker create "$image")
docker cp "$container_id:$source_path" "$destination_path"
docker rm "$container_id"

~によるとdocker create 文書、コンテナを実行しません。

このdocker createコマンドは、指定されたイメージに書き込み可能なコンテナレイヤーを作成し、指定されたコマンドを実行できるように準備します。これにより、コンテナIDがに印刷されますSTDOUT。これはdocker run -d、コンテナが起動していない場合と同様です。その後docker start <container_id>、いつでもこのコマンドを使用してコンテナを起動できます。


参考までに(以前の回答)画像からファイルを抽出する効率が低い方法は次のとおりです。

docker run some_image cat "$file_path" > "$output_path"

答え2

docker save出力全体を保存できない場合は、パイプを使用して必要なファイルを抽出できます。

残念ながら、出力は「tar of tars」なので、少し反復的なプロセスになる可能性があります。

今ファイルを抽出する必要があるときに私がしたことは次のとおりです。

  1. 関心のあるファイルの最近変更されたイメージバージョン(これを行う方法はイメージによって異なる場合があります)と作成/保存日を確認してください。

  2. 次のコマンドを使用して、コマンド出力からフルディレクトリを取得しますdocker save

    ドッカーを保存IMAGE_NAME | tar-tvf -

  3. layer.tarこのコマンドの出力で、手順1で決定した画像の日付と一致するファイルを見つけます。 (| grep layer.tarこのファイルのみを表示するように追加できます)

  4. ファイルをlayer.tar標準出力に抽出し、対応するディレクトリをインポートします。

    ドッカーを保存IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar -tvf-

  5. 目的のファイルがリストされていることを確認し、名前を見つけたら解凍します。

    docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar |文書

手順2/3で探している日付に一致する複数のファイルがある場合は、layer.tar正しいファイルが見つかるまで各ファイルに対して手順4を繰り返す必要があります。

上記のコマンドの大文字のテキストを、状況に応じた正しいイメージ名、チェックサム、ファイル名に置き換えます。

答え3

上記のどれも私には適していません。完全な作業コマンドは次のとおりです。

docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename

引用符なしでファイル名をcat渡さないため、何を表示するのかわかりません。また、コマンドの完了後にコンテナを削除することをお勧めします。

答え4

コンテナを作成せずに手動でレイヤーを操作する必要がない別のオプションは次のとおりです。ただし、複数のレイヤーに興味のあるファイルが含まれている場合は興味深いことがあります。

$ docker image save IMAGE_NAME | tar --extract --wildcards --to-stdout '*/layer.tar' | tar --extract --ignore-zeros --verbose FILE_OR_DIRECTORY

関連情報