回答:
次のコマンドを使用して、イメージからファイルを抽出できます。
docker create $image # returns container ID
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
docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
上記のどれも私にとってはうまくいきませんでした。完全な作業コマンドは次のとおりです。
docker run --rm --entrypoint /bin/sh image_name -c "cat /path/filename" > output_filename
引用符なしではcat
ファイル名なしで渡されるため、何を表示するかがわかりません。また、コマンドの終了後にコンテナを削除することをお勧めします。
間違っていなければ、ドッカーコンテナーはUbuntuの次のディレクトリに作成されたキャッシュファイルを保存すると信じています。
/var/lib/docker/aufs/diff/<container_id>
そこからファイルシステムにアクセスし、ファイルを取得できるはずです。
layersize
とのみが含まれ、json
ユーザーが読み取り可能ではありません(ユーザーがdockerグループに属している場合でも)。/var/lib/docker/aufs/diff
探しているファイルが含まれますが(コンテナIDではなく分類されます)、読み取りもできません。
/var/lib/docker/aufs
(内の他のすべてのディレクトリではなく/var/lib/docker/
)
の完全な出力を保存するdocker save
ことがオプションではない場合、パイプラインを使用して必要なファイルのみを抽出できます。
残念ながら、出力は「tar of tars」であるため、わずかに反復的なプロセスになる場合があります。
今ファイルを抽出する必要があるときに私がしたことは:
1)興味のあるファイルが最後に変更されたイメージのバージョンを特定します(これはおそらくイメージによって異なります)、および作成/保存された日付
2)docker save
次のコマンドを使用して、コマンドの出力から目次全体を取得します。
docker save IMAGE_NAME | tar -tvf -
3)layer.tar
手順1で決定したイメージの日付と一致する、そのコマンドの出力内のファイルを細かくします(| 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
layer.tar
ステップ2/3で探している日付に一致するファイルが複数ある場合は、適切なファイルが見つかるまで、それぞれについてステップ4を繰り返す必要があります。
上記のコマンドの大文字のテキストを、ケースの正しい画像名、チェックサム、およびファイル名に置き換えます。