##概要
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を作成します。
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の内容を適当に変更しています。
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