UbuntuイメージにDive tool を使ってみた

IPFactory Advent Calender 2023 4日目の記事です。

https://qiita.com/advent-calendar/2023/ipfactory

## はじめに
　どうも、色んな人のブログを読んでにちゃにちゃしているpizaです。
先日、[Medium](https://medium.com/)というブログサイトで、Docker Image を分析するツール「dive」について取り上げたブログを見つけました。イメージの分析という点が面白そうだなと思い、実際使用してみると想像以上でした！！！
　ということで、今回はDocker Image分析ツール「dive」の概要と基本操作についてまとめました。気になる方は是非お手元でお試しください。

↓影響を受けたブログ

https://blog.pentesteracademy.com/learn-to-analyze-docker-image-with-dive-tool-4cdee4aeef6b

## diveについて
　dive とは、Docker Image、レイヤーの内容を調査し、Docker/OCI イメージのサイズを縮小するためのツールである。

## 実施環境の準備
### ディレクトリ
```
├── Dockerfile
└── hello.txt
```

### Docker file
- パッケージのインストール
- ファイルの記述
- ファイルの上書き

```dockerfile:Dockerfile
FROM ubuntu:20.04

RUN  apt update          && \
     apt install -y vim

RUN  echo 'hello world' > ~/hello.txt

COPY ./hello.txt /root
```

### 上書き用ファイル
```text:hello.txt
You did a good job of overwriting it.
```

### ツールのインストール
公式のGitHubから、自分の環境に合わせてインストールする。
https://github.com/wagoodman/dive#installation

### イメージを用意する
分析したいイメージを手元に用意する。特にない場合は、先のDocker fileと以下のコマンドでimageを作成。
```
$ docker image build -t ubuntu_dv .
```

### dive実行
イメージ タグ/ID/ダイジェストを指定し、dive を実行。
```
$ dive <image name>

## 例：
$ dive ubuntu_dv
```

### 画面構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2966600/88c33898-69cc-13f6-d587-c46e0c8487b2.png)
- `Layers`:どのレイヤーを調査するかを選択
- `Layer Details`: そのレイヤーでなにを実行しているかを表示
- `Current Layer Contents`: Layersで指定したレイヤーに含まれているファイルツリーをサイズと共に表示
- `Image Details`: イメージ全体の情報を表示
`Tab`で`Layers`と`Current Layer Contents`の切り替え、`Ctrl+F`でファイル名検索などが可能。

### 操作と補足
#### 1. `Space`でフォルダを閉じる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2966600/af19d23e-38ee-c0d7-76cf-b922c5441feb.png)
        `Current Layer Contents`を選択時、開かれているディレクトリを`Space`で閉じることが可能。また、`Ctrl+Space`は一括ですべてのファイルを閉じることができる。しかし、一部のMacPCではこの機能を活用することが出来ないと言われている。

#### 2. vim インストールについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2966600/358a7e27-02bf-7f7a-dad9-64396d9b3012.png)
`vim`をインストールする際に、`apt upgate`を行っている。これにより、様々なファイルが追加、上書きされていっている。追加されたファイルは緑色、その他の変化(上書きや削除)があったファイルはオレンジ色になる。

#### 3.フィルターの掛け方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2966600/530ac228-d592-297e-330f-22a65f541e35.png)
2つ目のレイヤーでは`hello.txt`を作成する命令がある。しかし、ファイル保存先を絶対パスではなく、相対パスで指定しているため、直感で見つけることは少し面倒になる。その時使えるのが、`Ctrl+F`のフィルター機能だ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2966600/9f9bb133-c523-435a-0d65-f7b15d9595f8.png)
上の画像のようにフィルター機能を利用すると瞬時にファイルの位置を特定することが出来る。

### 外部からの上書きについて(おまけ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2966600/da846635-d717-d538-4966-1ebe341408f2.png)
`apt update`ではファイルの上書きがオレンジで表示されているのに対し、`COPY`を活用したファイルの上書きは文字が緑で表示されている。これにより、外部からのファイルの上書きはファイル更新ではなく、ファイルの追加として認識されるのだと推測される。

## さいごに
　いかがでしたでしょうか。実際手元で動かしてみると、想像以上に使いやすいツールだと思いませんか？？自分のImageだけでなく、Docker Hub上にある誰かのImageも見ることが出来るので、Dockerの勉強にも使えると思っています。というか、私はその使い方をしています、、、

それでは、これからも楽しい Docker Life を過ごしましょう！
最後までお読みいただき誠にありがとうございました。

## 参考資料
- https://github.com/wagoodman/dive
- https://hub.docker.com/_/ubuntu
- https://blog.pentesteracademy.com/learn-to-analyze-docker-image-with-dive-tool-4cdee4aeef6b
- https://kotaroooo0-dev.hatenablog.com/entry/2020/07/28/205931