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


24

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

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


どのディストリビューションを使用していますか?
リエカヨ16

@ryekayo:Ubuntu 14、docker 1.12.4(api 1.24)
BlakBat

回答:


21

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

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

3
エントリポイントを上書きしたい場合があります。docker run --entrypoint /bin/sh my_image -c /bin/cat some_file
アンドリュー

1
これにより、イメージが実行されます。これは、質問で述べたように、具体的にはやりたくないことです。
BlakBat

ああ、それは良い点です。私は現在の答えが満足のいくものではないことに同意します。
BBC

1
@BlakBatこの更新された回答はあなたに役立ちますか?新しい答えを作成する必要があったと思いますが、今は完了です。
bbc

1
@bbcこの更新された回答は、実際にはコンテナー(質問の核心)を開始せず、rootである必要はありません。
BlakBat

2

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

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

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


参照しているコマンドは、Dockerと、DockerfileでENTRYPOINT / CMDがどの程度正しく設定されているかによってのみ機能します。これは引用とは関係ありません。また、コンテナを削除するように言っていますが、まだ--rmを指定しています。最後に、質問を投稿したときに「イメージを実行せずに」と指定しましたが、これを考慮した解決策はありませんでした。
BlakBat

1
どちらのCMDとENTRYPOINTがDockerfileに設定されているかに関係なく、私は両方をオーバーライドするので、常に動作します(もちろんLinuxで)。「ドッカーに依存する」とはどういう意味ですか?設定、バージョン、環境、何?画像は実行できず、コンテナのみが実行できるため、質問は正しくありません。正解はないと思います。多くのファイルを扱うか、一時的なコンテナを作成する必要があります。--rmは一時コンテナを削除し、他の回答はディスク上にジャンクを残します。
sekrett

1

間違っていなければ、ドッカーコンテナーはUbuntuの次のディレクトリに作成されたキャッシュファイルを保存すると信じています。

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

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


いや。そのディレクトリにはlayersizeとのみが含まれ、jsonユーザーが読み取り可能ではありません(ユーザーがdockerグループに属している場合でも)。/var/lib/docker/aufs/diff探しているファイルが含まれますが(コンテナIDではなく分類されます)、読み取りもできません。
BlakBat

いくつか教えてください。調べてみます。コンテナに入ったり実行したりせずにファイルを取得する方法があることは事実です。
リエカヨ16

読めないことで、どのように表示されますか?私は、あなたがに/ var / libに/ドッキングウィンドウ/ AUFS /差分/ *ディレクトリに移動して、コンテナからテキストファイルを引き出すことができる例を発見した
ryekayo

私の間違い。ユーザーがアクセスすることができます/var/lib/docker/aufs(内の他のすべてのディレクトリではなく/var/lib/docker/
BlakBat

ルートとしてアクセスできますか?
リエカヨ16

0

の完全な出力を保存する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を繰り返す必要があります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.