web-dev-qa-db-ja.com

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

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

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

32
BlakBat

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

docker create $image  # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id

docker createdocumentation によると、これはコンテナを実行しません:

docker createコマンドは、指定されたイメージ上に書き込み可能なコンテナーレイヤーを作成し、指定されたコマンドを実行する準備をします。次に、コンテナIDがSTDOUTに出力されます。これはdocker run -dに似ていますが、コンテナが起動されない点が異なります。次に、docker start <container_id>コマンドを使用して、いつでもコンテナーを開始できます。


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

docker run some_image cat $file_path > $output_path
32
bbc

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

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

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

4
sekrett

私が間違っていないのであれば、Dockerコンテナには、Ubuntuの次のディレクトリに作成されたキャッシュファイルが格納されていると思います。

/var/lib/docker/aufs/diff/<container_id>

そこからファイルシステムにアクセスし、ファイルを取得できます。

1
ryekayo

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

残念ながら、出力は「タールのタール」であるため、わずかに反復的なプロセスになる可能性があります。

ちょうど今ファイルを抽出する必要があるときに私がしたことは:

1)関心のあるファイルが最近変更されたイメージのバージョン(これをどのように行うかは、おそらくイメージによって異なります)、およびイメージが作成/保存された日付を決定します

2)docker saveコマンドの出力から目次全体を取得します。

docker save IMAGE_NAME | tar -tvf -

3)コマンドの出力で、手順1で決定した画像の日付と一致するlayer.tarファイルを微調整します(| grep layer.tarを追加して、これらのファイルのみを表示できます)

4)layer.tarファイルを標準出力に抽出し、そのコンテンツのテーブルを取得します。

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

5)必要なファイルがリストされていることを確認し、名前が見つかったら抽出します。

docker save IMAGE_NAME | tar -xf - -O CHECKSUM_FROM_LIST/layer.tar | tar -xf - PATH/TO/YOUR/FILE

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

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

0
Michael Firth