Docker のbuildしたimageファイルの取扱で、"none"となったファイルの取扱に困り、問題を(無理やり)解消した件を記録します。
(困ったというのは、対応するcontainerのゴミを削除しても、docker rmi -f
で消そうとしても消せないことが、原因がわからず発生しました)
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
libraries mri2 76f924af5b91 9 months ago 1.381 GB
ubuntu 12.04 e216a057b1cb 9 months ago 103.6 MB
上記でリストされるのは、REPOSITORY名とTAG名が設定されているものだけになるようです。
しかし、操作方法の誤りからREPOSITORY名とTAG名が"none"となってしまう場合がある。
そういった場合は以下の「-a」全部表示するオプションを付けたコマンドを打てば表示される。ここに表示されているimageは基本利用しないため、HDDの容量を無駄に消費しているため削除した方が無難。
$ docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
libraries mri2 76f924af5b91 9 months ago 1.381 GB
<none> <none> a3e3f7862151 9 months ago 103.6 MB
ubuntu 12.04 e216a057b1cb 9 months ago 103.6 MB
そこで、"none"のimageを消そうとすると、以下のエラーが表示されることがある(理由は、調べきれていないため不明)。
$ docker rmi a3e3f7862151
Error response from daemon: conflict: unable to delete a3e3f7862151 (cannot be forced) - image has dependent child images
docker ps -a
で確認しても対応するcontainerは見つからず、強制削除のオプション「-f」を付けても削除できず、同じエラーが表示される。
こういう時、物理的にファイルを削除すると、うまくいくことがわかった。
つまり、下記のコマンドで示すように、ファイルを探し出し、削除する方法です。
$ find /var/lib/docker/image/aufs/imagedb/content/sha256 -name "a3e3f7862151*"
/var/lib/docker/image/aufs/imagedb/content/sha256/a3e3f7862151f618ed54ffd828c8086a2bfef23d6121a689ff46e6498ed58a4f
$ rm /var/lib/docker/image/aufs/imagedb/content/sha256/a3e3f7862151f618ed54ffd828c8086a2bfef23d6121a689ff46e6498ed58a4f
参考にしたのは、下記のページです。
cannot delete some images #12487
REPOSITORY名とTAG名が設定されていれば正規の方法でできると思いますが、今回"none"となって対応方法が見つかりませんでした。
最終手段として/var/lib/docker以下を破棄して対応している人がいるようなので、全部消すなら一度ファイル単位で消してみようと試してみました。
今のところ、手元の環境は動作しています。