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 > /version
をRUN 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