イメージを実行せずに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」なので、少し反復的なプロセスになる可能性があります。
今ファイルを抽出する必要があるときに私がしたことは次のとおりです。
関心のあるファイルの最近変更されたイメージバージョン(これを行う方法はイメージによって異なる場合があります)と作成/保存日を確認してください。
次のコマンドを使用して、コマンド出力からフルディレクトリを取得します
docker save
。ドッカーを保存IMAGE_NAME | tar-tvf -
layer.tar
このコマンドの出力で、手順1で決定した画像の日付と一致するファイルを見つけます。 (| grep layer.tar
このファイルのみを表示するように追加できます)ファイルを
layer.tar
標準出力に抽出し、対応するディレクトリをインポートします。ドッカーを保存IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar -tvf-
目的のファイルがリストされていることを確認し、名前を見つけたら解凍します。
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