code & booze

自己学習とは無縁なSIer業界に身を置くエンジニアがアウトプットします

【Docker】 <none> となったコンテナイメージを一括で削除する方法

f:id:kiy-s:20190303145030p:plain

Dockerコンテナイメージで<none>になってしまったイメージを一括で削除する方法。

<none> とは?

<none>とは以下のようなイメージのことです。
docker imagesでイメージ一覧を出力します。

docker images

さらにフィルタリングでnoneのみ出力します。
noneを特定するにはdanglingフラグを使用します。

danglingフラグがtrueのイメージがnoneであるため、-fのフィルタリングオプションで絞り込みます↓

$ docker images -f dangling=true
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              5f5446cea392        6 days ago          567MB
<none>              <none>              559f897c8512        6 days ago          538MB
<none>              <none>              083f833f8efc        8 days ago          372MB
<none>              <none>              6cf94a7cee11        8 days ago          372MB
<none>              <none>              68582de807e7        8 days ago          372MB
<none>              <none>              2a314987d966        10 days ago         973MB
<none>              <none>              6ace3a5d43da        10 days ago         973MB
<none>              <none>              1c42d72cb450        10 days ago         972MB
<none>              <none>              1558b4d5599f        11 days ago         972MB
<none>              <none>              93ae42d193fa        2 weeks ago         372MB
<none>              <none>              f64b56e8799c        2 weeks ago         372MB
<none>              <none>              3708890d3a9b        3 weeks ago         969MB

気にしていなかったですが、noneとなっているものが結構多くありますね。。。

もともとは通常のイメージでしたが、いつの間にか本来イメージ名やTAG名が表示されるところに<none>が表示されてよくわからないイメージになってしまっています。

<none> を削除する方法

結論から書きますが、以下のコマンドにより削除可能です。

$ docker rmi $(docker images -f "dangling=true" -q)

noneを削除

数が多かったので全てはのせませんが、削除イメージのダイジェストが表示されてnoneイメージが削除されたことが確認できました。

コマンドを簡単に説明すると、$(docker images -f "dangling=true" -q)でフィルタリングを行いnoneイメージを抽出します。
抽出した結果をdocker rmiコマンドへ渡すことにより抽出されたnoneイメージに対してのみ削除を行っています。

ちなみに、現在のコンテナで使用中のイメージがある場合、上記のコマンドでも削除はされないので注意してください。
強制的に削除したい場合は-fオプションを付けてください。

$ docker rmi -f $(docker images -f "dangling=true" -q)

なお、コマンドの詳細は公式ドキュメントも参照ください!

docs.docker.com

docs.docker.com

なぜ<none> イメージになってしまうのか?

これも結論から書きますが、イメージ名/Tagともに重複するイメージを作ってしまう時に既存のイメージがnoneに変化しているからです。
イメージ名とTag名の両方が重複した場合、Dockerは既存のイメージからイメージ名とTag名を取り除き、新規に作成したイメージに元の名前/Tagを付与します。

簡単にですが、試してみます↓

FROM nginx:alpine
RUN echo "test"

Dockerfileのディレクトリでイメージのビルドコマンドを実行。

$ docker build -t nginx:v1 .
$ docker images
REPOSITORY                   TAG                    IMAGE ID            CREATED             SIZE
nginx                        v1                     8f898bd5a4f0        3 seconds ago       16.1MB

再度、ビルドコマンド実行(中間イメージを再利用しないように--no-cacheオプションを付与します)

$ docker build --no-cache -t nginx:v1 .
$ docker images
REPOSITORY                   TAG                    IMAGE ID            CREATED             SIZE
nginx                        v1                     f2bca9c43df7        1 second ago        16.1MB
<none>                       <none>                 8f898bd5a4f0        4 minutes ago       16.1MB

上記のように最初のビルドで作成したイメージがnoneに変わっていることが確認できます(IMAGE IDを参照)
none化は異なるイメージ名にするか、Tagを変えてビルドすることにより回避することが可能です。

noneイメージは明らかに使わないものであり、容量も圧迫するので、定期的に削除するのがおススメです。