Dockerfileをビルドすると<none>:<none>イメージが生成される理由

##概要
DockerfileからDockerイメージを作成する時に、何度も同じイメージ名でbuildを繰り返していると、

```
$ docker build -t <イメージ名> .
```
以下のような、＜none＞：＜none＞イメージが作成される。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
app                 latest              993cb7f8cc4b        25 seconds ago      72.9MB
<none>              <none>              ee308f906f56        4 minutes ago       72.9MB
ubuntu              latest              f643c72bc252        9 days ago          72.9MB
```


##＜none＞:＜none＞イメージが生成される流れ
簡単な例に沿って、＜none＞：＜none＞イメージが作成される流れを理解します。
まずは、適当なDockerfileを作成します。

```docker:Dockerfile
FROM ubuntu:latest
RUN echo hello > hello.txt
```
次に上記で作成したDockerfileをビルドします。
※オプション-tで、appと言うイメージ名にしていますが、適当です。
※カレントディレクトリにいる前提で、「.」を指定しています。

```
$ docker build -t app .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM ubuntu:latest
latest: Pulling from library/ubuntu
da7391352a9b: Pull complete 
14428a6d4bcd: Pull complete 
2c2d948710f2: Pull complete 
Digest: sha256:c95a8e48bf88e9849f3e0f723d9f49fa12c5a00cfc6e60d2bc99d87555295e4c
Status: Downloaded newer image for ubuntu:latest
 ---> f643c72bc252
Step 2/2 : RUN echo hello > hello.txt
 ---> Running in 12a6fb70abb8
Removing intermediate container 12a6fb70abb8
 ---> ee308f906f56
Successfully built ee308f906f56
Successfully tagged app:latest
```
ビルドが成功したので、イメージを確認してみると、ルートイメージである「ubuntu」と先ほどビルドした「app」ができます。
ここで注目するのは、appのイメージIDが**「ee308f906f56」**である事を覚えておいて下さい。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
app                 latest              ee308f906f56        About a minute ago   72.9MB
ubuntu              latest              f643c72bc252        9 days ago           72.9MB
```

先ほど作成したDockerfileの中身を適当に変更してみます。
※ここでは、RUNの内容を適当に変更しています。

```docker:Dockerfile
FROM ubuntu:latest
RUN echo world > world.txt
```

変更したら、先ほどと同じように同じイメージ名でビルドしてみます。

```
$ docker build -t app .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM ubuntu:latest
 ---> f643c72bc252
Step 2/2 : RUN echo world > world.txt
 ---> Running in 85ef42ffb268
Removing intermediate container 85ef42ffb268
 ---> 993cb7f8cc4b
Successfully built 993cb7f8cc4b
Successfully tagged app:latest
```

ビルドが成功しました。
イメージを確認してみると、ルートイメージ「ubuntu」とビルドした「app」の他に＜none＞:＜none＞イメージが新たに作成されていることが確認できます。
最初にビルドした時の「app」のイメージID「ee308f906f56」が＜none＞イメージとなり、新たにイメージID「993cb7f8cc4b」が作成されました。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
app                 latest              993cb7f8cc4b        25 seconds ago      72.9MB
<none>              <none>              ee308f906f56        4 minutes ago       72.9MB
ubuntu              latest              f643c72bc252        9 days ago          72.9MB
```

##なぜ、＜none＞:＜none＞イメージが生成されるのか
＜none＞:＜none＞イメージが生成される理由は、**同じ名前のイメージを作り直す**のが原因です。
Dockerでは、異なるイメージに同じイメージ名をつけることはできません。
そのため、古い方のイメージはイメージ名を剥奪されて、＜none＞:＜none＞となってしまいます。
このようなイメージの事を、**Danglingイメージ**と言います。（意味を持たないぶら下がった状態である事を指します）

##Danglingイメージを削除するには
Dangilingイメージは、特別な理由がない限り不要なので削除します。
わかりやすいように、数あるイメージの中から、Danglingイメージのみを抽出します。

```
$ docker images -f dangling=true
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              ee308f906f56        44 minutes ago      72.9MB
```
Dangling状態のイメージを削除します。

```
$ docker rmi <Dangling状態のイメージID>
```
複数のDanglingイメージを一括で削除したい場合は次のようにします。

```
$ docker rmi $(docker images -f 'dangling=true' -q)
または
$ docker image prune
```