Dockerイメージの内容を確認する方法


291

私はドッカーのプルを行い、ダウンロードした画像を一覧表示できます。この画像の内容を見たいです。ネットで検索しましたが、正解はありませんでした。



10
だまされない。コンテナと画像の表示は同じではありません。初期のファイルシステムを表示したり、実行する前にイメージ内に悪意のあるものがないことを確認したりすることもできます。
キーラロン

4
イメージをコンテナーとして実行できなかった場合は、ドライブ(github.com/wagoodman/dive)などのツールを使用するか、docker saveを使用してイメージをtarファイルとしてエクスポートできます。次に、タールを探索するか、ダイビングで画像をすぐに探索できます。
FunThomas424242

回答:


372

その画像を使用してインタラクティブなシェルコンテナーを実行し、その画像に含まれるコンテンツを探索できます。

例えば:

docker run -it image_name sh

または、 entrypoint

docker run -it --entrypoint sh image_name

または、イメージがどのように構築されたか、つまりの手順を確認したい場合はDockerfile、次のことができます。

docker image history --no-trunc image_name > image_history

ステップはimage_historyファイルに記録されます。


1
ありがとう。最初は私が探しているものです。基本的にフォルダを探索します。
pylearn 2017年

9
「FROMスクラッチ」を使用して作成されたイメージの内容を確認しようとしていますが、使用可能なシェルがありません。内容を確認する方法は他にありますか?私が見ようとしている画像はportainer / portainerです。
ファンエルナンデス

2
誰かがコンテナを生成せずに画像のコンテンツを見る可能性はありますか?それとも、コンテナーからコンテナーを生成する権限がない限り、すべてのユーザーから安全であると想定できますか?
Shabirmean 2017

3
以前に「Windowsコンテナーとエントリーポイントの場合」と言われたことを組み合わせるdocker run -it --entrypoint cmd <image_name>と、機能します。
ベイタンカート

2
示すように@JuanHernandezは、はい、あなたは画像の完全な内容をダンプすることができますstackoverflow.com/a/42677219/320594
Jaime Hablutzel、2018年

197

ここで受け入れられた答えは問題です。これは、画像に何らかのインタラクティブシェルが含まれる保証がないためです。例えば、ドローン/ドローンの画像は、単一のコマンドに含まれ/droneそしてそれが持っているENTRYPOINTとしても、これは失敗します。

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

そしてこれは失敗します:

$ docker run --rm -it --entrypoint sh drone/drone
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"sh\": executable file not found in $PATH".

これは珍しい設定ではありません。多くの最小限のイメージには、ターゲットサービスをサポートするために必要なバイナリのみが含まれています。幸い、画像の内容に依存しない画像ファイルシステムを探索するメカニズムがあります。最も簡単なのは、おそらくコンテナファイルシステムをtarアーカイブとしてdocker exportエクスポートするコマンドです。したがって、コンテナーを開始します(失敗するかどうかは関係ありません)。

$ docker run -it drone/drone sh
FATA[0000] DRONE_HOST is not properly configured        

次に、を使用docker exportしてファイルシステムをにエクスポートしますtar

$ docker export $(docker ps -lq) | tar tf -

docker ps -lq「私の最も最近のドッキングウィンドウコンテナのIDを与える」が意味しています。これを明示的なコンテナー名またはIDに置き換えることができます。


5
この答えは、与えられた時間で容器の内側にあるかもしれないものを図に超便利です
ジョアン・アンドラーデ

2
この答えは、より正確であると私の作品、私は外国人の建築で、画像の内容を探検したいので、私はそれを「だけで実行」することはできません
ウラジミールPerevalov

94

画像の内容を見るためだけにコンテナを起動するべきではありません。たとえば、悪意のあるコンテンツを探すのではなく、実行したい場合があります。「実行」の代わりに「作成」を使用します。

docker create --name="tmp_$$" image:tag
docker export tmp_$$ | tar t
docker rm tmp_$$

11
上記の2行目は、ファイルシステムの内容を示しています。すべてのファイルをtarとして取得したい場合は、のようなものに置き換えることができますdocker export tmp_$$ > image-fs.tar
ピノ

Windows OSの2行目は何ですか?docker export tmp_$$ | tar t動作しません。
Alexei Marinichenko

@Alexei Marinichenko tarがマシンにインストールされていない可能性があります。tar --help確認してみてください。
Abdurrahman I.

1
これは、コンテナにシェルがない場合にも機能します
Peter Dotchev

3
@AlexeiMarinichenko -oパラメータを使用して、書き込むファイルを指定できます。例えばdocker export -o c:\temp\tmp_$$.tar tmp_$$
GiddyUpHorsey

62
docker save nginx > nginx.tar
tar -xvf nginx.tar

次のファイルが存在します:

  • manifest.json –コンテナープロパティを持つjsonファイルのファイルシステムレイヤーと名前を記述します。
  • .json –コンテナーのプロパティ
  • –各「layerid」ディレクトリには、レイヤーのプロパティとそのレイヤーに関連付けられたファイルシステムを説明するjsonファイルが含まれています。Dockerはコンテナーイメージをレイヤーとして保存し、イメージ間でレイヤーを再利用することでストレージスペースを最適化します。

https://sreeninet.wordpress.com/2016/06/11/looking-inside-container-images/

または

ダイビングを使用して、TUIでインタラクティブに画像コンテンツを表示できます

ここに画像の説明を入力してください

https://github.com/wagoodman/dive


5
ファイルを取得するためにコンテナーを開始する必要がないため、これは私にとって最も有用な答えのようです。
Alec Thomas

1
@AlecThomasに完全に同意します。さらに一歩進んで、なぜdocker本質的に異なるタイプのアーカイブファイルの内容を確認する必要があるのでしょうか。
Ed Randall

良い答えですが、タグも指定しますdocker save --output nginx.tar nginx:latest。それ以外の場合、ドキュメントによれば、「すべての親レイヤーとすべてのタグ+バージョン」が含まれます
Tarek

内部にUnix utilsがない場合、これが内部を探索する唯一の方法であるため、これは賛成されるべきです。また、この方法ではコンテナを作成する必要はありません。
Stanislav German-Evtushenko

9

あなたが実行する必要が画像の詳細な内容一覧表示するにはdocker run --rm image/name ls -alRどこ--rmの手段は、すぐに終了するが、容器を形成として削除を。

ここに画像の説明を入力してください


11
これは、イメージがls利用可能であり、PATH
chaosaffe

6

ドッカー画像の探索

  1. そこにどんな種類のシェルが入っているのbashか、shまたは...

    最初に画像を検査します。 docker inspect name-of-container-or-image

    探しentrypointcmdJSONリターンで。

  2. 次に行います: docker run --rm -it --entrypoint=/bin/bash name-of-image

    一度doの中に入る:ls -lsaまたは次のような他のシェルコマンド:cd ..

    -itインタラクティブ...とtty の略です。--rm実行後のコンテナの取り外しの略です。


1
この回答の問題は、受け入れ答えで述べたように、あなたのイメージは持っているという保証がない、ということである任意のそれでシェルを。またはls。または、本当に一般的なツールです。
larsk、

4

次のように、より簡単な方法を試すことができます。

docker image inspect image_id

これはDockerバージョンで機能しました:

DockerVersion": "18.05.0-ce"

12
内容は表示されません。画像の作成に使用されたレイヤーなどのみが表示されます。
Roger Lipscombe

0

Docker EE for Windows(Hyper-V Server 2016の17.06.2-ee-6)では、WindowsコンテナーのすべてのコンテンツをC:\ProgramData\docker\windowsfilter\ホストOSのパスで検査できます。

特別な取り付けは必要ありません。

フォルダープレフィックスは、docker ps -a出力からのコンテナーIDによって見つけることができます。


-1

コンテナイメージのスキャンに使用できるAnchoreと呼ばれる無料のオープンソースツールがあります。このコマンドを使用すると、コンテナイメージ内のすべてのファイルを一覧表示できます

anchore-cli画像コンテンツmyrepo / app:latestファイル

https://anchore.com/opensource/

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