うさぎ好きエンジニアの備忘録

うさぎたちに日々癒されているエンジニアが業務で直面したもの & 個人的な学習メモを残していきます。

Dockerに<none>:<none>なイメージができている件

Dockerイメージを作っていると、いつの間にか<none>:<none>のようなイメージが作成されていた。

REPOSITORY                           TAG                                                     IMAGE ID       CREATED          SIZE
<none>                               <none>                                                  d0184a7c8b90   15 minutes ago   6.28GB
<none>                               <none>                                                  152bbffa1a03   22 minutes ago   3.43GB
<none>                               <none>                                                  6000e2b1dd39   2 days ago       788MB

意外とサイズも大きいし、結構気になるので調べてみた。

<none>:<none>ってなに?

試しにどういう状況でこれが起きるか検証してみる。

まず、以下のようなDockerfileを用意してビルドする。

FROM alpine
RUN echo v1 > /version
$ docker image build -t test .
...

$ docker image ls
REPOSITORY                           TAG                                                     IMAGE ID       CREATED          SIZE
test                                 latest                                                  709c015bf8ed   20 seconds ago   5.61MB

IMAGE IDが709c015bf8edのイメージが作成できた。次にRUN echo v1 > /versionRUN echo v2 > /versionに書き換えて再度ビルドしてみる。

$ cat Dockerfile
FROM alpine
RUN echo v1 > /version

$ docker image build -t test .
...

$ docker image ls
REPOSITORY                           TAG                                                     IMAGE ID       CREATED          SIZE
test                                 latest                                                  efcb441cd4e6   4 seconds ago    5.61MB
<none>                               <none>                                                  709c015bf8ed   2 minutes ago    5.61MB

<none>:<none>なイメージが生成された。

このイメージについてよくみてみると、最初のビルドの時に生成されたtestイメージと同じIMAGE IDを持っていることがわかる。このことから<none>:<none>イメージができるのは、同じ名前のイメージを作り直すのが原因だということがわかった。 (古い方のイメージからイメージ名が取り除かれた結果<none>:<none>になった)

この<none>:<none>イメージのことをdangling imageといい、コンテナが参照していないのであればこれは削除してしまって良い。

dangling imageの削除

Dockerイメージの削除自体はdocker image rmでできるが、docker imageコマンドは-fオプションを指定することで特定のイメージの情報を抽出できるので、それを利用して削除すればOK。

$ docker images -f "dangling=true"
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
<none>       <none>    709c015bf8ed   7 minutes ago    5.61MB
<none>       <none>    d0184a7c8b90   26 minutes ago   6.28GB
<none>       <none>    152bbffa1a03   33 minutes ago   3.43GB
<none>       <none>    6000e2b1dd39   2 days ago       788MB

削除自体はdocker rmiでやる感じ。

$ docker rmi $(docker images -f "dangling=true" -q)
Deleted: sha256:709c015bf8ed981109a87aeb44c76d1075dbcd00a72132e63849591e8c8c7733
Deleted: sha256:d0184a7c8b903eead1d0f52d41466720790ac26ddbd361cee0c80653bae17c50
Deleted: sha256:152bbffa1a0379f015a6263e3ec85e73a9e6c036589f612d800eee8c6e8caf3d
Deleted: sha256:6000e2b1dd399cea8a73d18d7d4e2c2fe6ab0c95fd0b5edacd1e204af38c892e