【Dockerfile】FROM / RUN で vi の使える Ubuntu イメージをビルドする

# はじめに
この記事では、Dockerfile で vi の使える Ubuntu イメージをビルドする手順について記載します。
Dockerfile の以下のインストラクションへの理解促進の一環で行っています。

- `FROM`
- `RUN`

https://docs.docker.com/reference/dockerfile/

# 開発環境
開発環境は以下の通りです。

- Windows 11
- Docker Engine 26.1.1
- ubuntu 24.04

# ベースイメージを指定する `FROM`
ベースとなるイメージの指定は、`FROM` インストラクションで行います。

https://docs.docker.com/reference/dockerfile/#from

今回のベースイメージは、2024年6月時点で latest タグと同等の [`ubuntu:24.04`](https://git.launchpad.net/cloud-images/+oci/ubuntu-base/tree/oci/index.json?h=refs/tags/dist-noble-amd64-20240605-baf9888c&id=baf9888c79d71a0ae98d4ef87c838ca3c91f2245) にします。

https://hub.docker.com/_/ubuntu

```Dockerfile
# FROM <image>[:<tag>]
FROM ubuntu:24.04
```

# Dockerfile でイメージをビルドする `image build`
一度 Dockerfile からイメージをビルドしてみます。
※現時点では、`ubuntu:24.04` と同じイメージができます。

Dockerfile からのイメージのビルドは、`docker image build` コマンドで行います。

https://docs.docker.com/reference/cli/docker/image/build/

```powershell
# docker image build [OPTIONS] PATH | URL | -
docker image build --tag my-ubuntu:24.04 .
```

- `--tag` : ビルドしたイメージにタグをつける

コマンドを実行するとイメージがビルドされます。
先ほど Dockerfile に記載した `FROM` インストラクションが実行されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/7bbbcffe-27a9-7738-5ef3-ded472a67d12.png)

以下のコマンドで、`my-ubuntu:24.04` がビルドされたことがわかります。

```powershell
docker image ls my-ubuntu
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/d53ae98f-ac0d-745b-417b-bad2cd9dc021.png)

次はビルドしたイメージからコンテナを起動します。
なお、現時点では、vi がインストールされていないため、コンテナ起動時に vi コマンドのパスを確認しても何も応答されません。

```
docker container run my-ubuntu:24.04 which vi
```

また、`docker image history` コマンドで履歴情報を確認してみます。

https://docs.docker.com/reference/cli/docker/image/history/

現時点では、今回作成した `my-ubuntu:24.04` もベースイメージの `ubuntu:24.04` も履歴情報は同じです。

```powershell
# docker image history [OPTIONS] IMAGE
docker image history my-ubuntu:24.04
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/2a9cf956-4201-dfce-a88a-889485f2632d.png)

```powershell
docker image history ubuntu:24.04
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/b19c5b1f-ac62-e06a-22fd-931ba72b21c0.png)


# vi コマンドをインストールする `RUN`
vi コマンドをインストールして、vi コマンドが使えるようにします。
インスールは、`RUN` インストラクションでコマンドを実行することで行われます。
コマンドを実行すると、現在のイメージの上に新しいレイヤが作成されます。

https://docs.docker.com/reference/dockerfile/#run

```Dockerfile
FROM ubuntu:24.04

# RUN [OPTIONS] <command> ...
RUN apt-get update
RUN apt-get install -y vim
```

Dockerfile を更新したので、再ビルドします。

```powershell
docker image build --tag my-ubuntu:24.04 .
```

:::note
`RUN apt-get update` と `RUN apt-get install -y vim` を実行している分、先ほどよりもビルドに時間がかかります。
:::

追記した `RUN apt-get update` と `RUN apt-get install -y vim` が実行されたことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/b778931f-c04a-ed54-3cdb-5275f1644ca0.png)

改めて、コンテナ起動時に vi コマンドが使えるか確認します。

```powershell
docker container run my-ubuntu:24.04 which vi
```

今回は、パスが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/15fc5ae1-3dd1-04f7-5017-7c89620de6db.png)

また、vi を起動することもできます。

```powershell
docker container run --interactive --tty my-ubuntu:24.04 vi
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/b6e73621-6f3e-9955-c469-5c564a66c2e5.png)


# 参考
- [Dockerfile reference](https://docs.docker.com/reference/dockerfile/)
- [docker image build](https://docs.docker.com/reference/cli/docker/image/build/)
- [docker image history](https://docs.docker.com/reference/cli/docker/image/history/)
- [	鈴木亮「開発系エンジニアのためのDocker絵とき入門」秀和システム、2024](https://www.shuwasystem.co.jp/book/9784798071503.html)

# 関連記事

https://qiita.com/Yasushi-Mo/items/17f755b9160767947d3e