イメージを実行せずにDockerイメージからファイルを抽出したいのですが。
docker save
オプションは、特定のファイルをuntarするだけではファイルを大量に保存するため、現在のところ私にとって実行可能なオプションではありません。
次のコマンドを使用して、イメージからファイルを抽出できます。
docker create $image # returns container ID
docker cp $container_id:$source_path $destination_path
docker rm $container_id
docker create
documentation によると、これはコンテナを実行しません:
docker create
コマンドは、指定されたイメージ上に書き込み可能なコンテナーレイヤーを作成し、指定されたコマンドを実行する準備をします。次に、コンテナIDがSTDOUT
に出力されます。これはdocker run -d
に似ていますが、コンテナが起動されない点が異なります。次に、docker start <container_id>
コマンドを使用して、いつでもコンテナーを開始できます。
参考までに(私の以前の回答)、画像からファイルを抽出する非効率的な方法は次のとおりです。
docker run some_image cat $file_path > $output_path
上記のどれも私にとってはうまくいきませんでした。完全な作業コマンドは次のとおりです。
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
引用符なしでは、cat
はファイル名なしで渡されるため、何を表示するかわかりません。また、コマンドが終了した後でコンテナを削除することをお勧めします。
私が間違っていないのであれば、Dockerコンテナには、Ubuntuの次のディレクトリに作成されたキャッシュファイルが格納されていると思います。
/var/lib/docker/aufs/diff/<container_id>
そこからファイルシステムにアクセスし、ファイルを取得できます。
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を繰り返す必要があります。
上記のコマンドの大文字のテキストを、ケースに適した正しいイメージ名、チェックサム、およびファイル名に置き換えます。