wagoodman/dive: A tool for exploring each layer in a docker image
wagoodman/dive は Docker イメージの各レイヤーを調査するためのツールです。大雑把に使うには次の様に wagoodman/dive に親となる Docker のアクセス方法を渡し、調査対象のイメージを引数として docker run するのがいいです。
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive [image名 or imageID] # 例. docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive mysql:5.7 docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive dcb0aab0a5e0
このコマンドで次の様なレイヤーとそれに対応するファイルシステムの変化を見ることができます。これを上手く使うとイメージから Dockerfile を作るリバースエンジニアリングもできます。
wagoodman/dive が便利な時は Docker イメージの容量を削減したり、ビルドに失敗した Docker イメージの中で何が起きていたか調べる時です。
イメージの容量を削減する際にはボトルネックとなるレイヤーを簡単に見つけられます。これは dive 実行時の左上の Layers 欄を見れば一発です Docker Desktop も次添付ファイルの様に似たことができますが、dive ではレイヤー中のファイルシステムの中を調べることができ、何が原因となってボトルネックとなっているか調べやすいです。パッケージマネージャの不要なキャッシュ(yarnなど)がイメージの容量を食っているとわかった時など容量を最適化するチャンスです。
またイメージビルドの失敗の原因の手掛かりにもなります。都度 Dockerfile 内にRUN ls
など書かずとも壊れた状態をすぐ見れます。これを行うにはビルド失敗直後にdocker images -a
とコマンドを実行して、つい最近 CREATED された無名のイメージの ID を取得し、
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive [イメージID] 例. # 次の様に docker images -a の結果が出力されたならば # REPOSITORY TAG IMAGE ID CREATED SIZE # <none> <none> dcb0aab0a5e0 7 hours ago 556MB # IMAGE ID を渡して次の様に実行 docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive dcb0aab0a5e0
とするのがいいです。この方法は、エラーメッセージに直接現れないあるべきファイルがなかったり余分なファイルが既にあったりするビルド失敗の原因にたどり着きやすいです。