suin.io

Dockerに<none>:<none>なイメージが生まれてくる理由

suin2016年8月1日

Dockerを使っていると、いつのまにかイメージの中に<none>:<none>というのができてきます。これは一体どこからやってくるのでしょうか?

理由を説明するには、再現してみるのが早いと思うので、だれでも再現できる手順を見てみます。

まず、適当にDockerfileを作ります。

Dockerfile
FROM alpine
RUN echo v1 > /version

これをビルドします。

$ docker build -t app .
Sending build context to Docker daemon 64.51 kB
Step 1 : FROM alpine
 ---> 4e38e38c8ce0
Step 2 : RUN echo v1 > /version
 ---> Running in 95d3b020148e
 ---> 7f8063ab7992
Removing intermediate container 95d3b020148e
Successfully built 7f8063ab7992

すると、ルートイメージであるalpineと今ビルドしたappができます。特に、appのイメージID7f8063ab7992に注目していてください。このイメージをapp(v1)とします。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
app                 latest              7f8063ab7992        55 seconds ago      4.799 MB
alpine              latest              4e38e38c8ce0        5 weeks ago         4.799 MB

次に、先ほどのDockerfileに変更を加えます。

Dockerfile
FROM alpine
RUN echo v2 > /version

これを同じ手順でビルドすると、新しいappのイメージができます。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
app                 latest              587e84e618e9        20 seconds ago      4.799 MB
<none>              <none>              7f8063ab7992        3 minutes ago       4.799 MB
alpine              latest              4e38e38c8ce0        5 weeks ago         4.799 MB

新しいapp(これをv2とします)のほうは、イメージIDが587e84e618e9になっています。一方で、app(v1)のほうはイメージIDが7f8063ab7992でした。これがapp(v2)がビルドされた後から<none>:<none>になっています。

もうお分かりかと思います。<none>:<none>のイメージができるのは、同じ名前のイメージを作り直すのが原因です。Dockerでは異なるイメージに同じイメージ名を付けられません。なので、古いほうのイメージはイメージ名が取り除かれて<none>:<none>になるというわけですね。

ちなみに、この<none>:<none>のイメージのことをDockerではdangling imageと呼びます。基本的にコンテナがこのイメージを参照していなければ、不要なイメージとなるので削除してかまいません。dangling imageの削除方法についてはDockerの不要なコンテナ・イメージを一括削除する方法をご覧ください。

RELATED POSTS