本文へスキップ

Dockerイメージのレイヤー解析

Docker Image Explorer

書き出したイメージのtarを開き、レイヤーごとのコマンド・大きさ・足したり消したりしたファイルを見せます。

書き出したDockerやOCIのイメージを開き、レイヤーごとに実際に何が入っているのかを見せます。大きさ、そのレイヤーを作ったDockerfileの手順、追加したファイル、そして下のレイヤーから消したファイルまで出ます。イメージがなぜ300メガバイトなのかを突き止める方法です。

🔒 ブラウザの中だけで動きますdockerocilayersinspect

書き出したイメージ(.tar)を置く

`docker save image:tag -o image.tar` か podman save で作ったファイルです。このタブの中で解析し、どこにもアップロードしません。

docker save の tar と OCI イメージレイアウトの両方を開き、設定の history からレイヤーごとの Dockerfile の手順を突き合わせます( empty_layer と印の付いた手順 — ENV、CMD、LABEL — はレイヤーを作らないので別に並べます)。削除は OCI の whiteout 規約から読みます。 .wh.name という項目は、下のレイヤーにある name を取り除きます。ファイル自体は下のレイヤーに残ったままで、そのぶんの容量も食い続けます。

使い方

  1. イメージを書き出します

    `docker save image:tag -o image.tar`か、それに相当する`podman save`を使います。OCIのイメージレイアウトでも構いません。

  2. tarを置きます

    このタブのワーカーの中でパースします。何もアップロードしません。イメージのtarにはファイルシステム全体が入っているので、そこが大事なところです。

  3. 大きいレイヤーを開きます

    行ごとに大きさが棒で、対応するDockerfileの手順とともに出ます。開くと、そのレイヤーが追加した大きなファイルが並び、消したものと隠したものも別に出ます。

よくある質問

後ろのRUNで消したのに、イメージが大きいままなのはなぜですか

削除そのものが1つのレイヤーだからです。OCIのwhiteoutの約束事は`.wh.name`という項目を書いて、下のレイヤーの`name`を隠すだけです。元のファイルはそこにあり続け、配布され続け、容量にも数えられ続けます。作ったのと同じ`RUN`の中で消すか、マルチステージビルドを使ってください。

レイヤーの無いDockerfileの手順があるのはなぜですか

ENV、CMD、LABEL、EXPOSEなどは設定を変えるだけで、ファイルシステムには触れません。だからイメージのhistoryが`empty_layer`と印を付けます。ここでは別に並べているので、実際に容量を使うものとレイヤーの番号がずれません。

レジストリから直接開けますか

開けません。ローカルのtarだけを読みます。取ってくるとなると、このページがレジストリに対して認証することになりますが、それは脅威モデルの違う別の道具です。`docker save`は1回で済みます。

ここに出る大きさが`docker images`と違います

測っているものが違います。`docker images`は、ストレージドライバが共有レイヤーを重複排除したあとのディスク上の大きさです。ここは、書き出したファイルの中の各レイヤーの、圧縮前の内容の大きさです。どちらも正しく、`docker pull`が何を運ぶのかを教えてくれるのは後者です。

ここから渡せます

次の一手

このツールが出したものをそのまま受け取れる道具です。