背景
偶然間發現服務器上有不少鏡像佔用很多空間,想清理一下。
結果直接進行刪除報錯:docker
docker rmi 8f5116cbc201 Error response from daemon: conflict: unable to delete 8f5116cbc201 (cannot be forced) - image has dependent child images
而後上網需求方法,主流的方法有兩種數據庫
方法一:強制刪除鏡像編程
docker rmi -f 8f5116cbc201 Error response from daemon: conflict: unable to delete 8f5116cbc201 (cannot be forced) - image has dependent child images
以失敗了結。。。服務器
方法二:批量刪除容器,再刪除鏡像 # 中止全部容器 docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop # 刪除全部容器 docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm # 刪除全部none鏡像 docker images|grep none|awk '{print $3 }'|xargs docker rmi
仍是以失敗了結。。。。。
編程語言
緣由
搜了好久,發現實際上是由於TAG的問題,即有其餘 image FROM 了這個 image,可使用下面的命令列出全部在指定 image 以後建立的 image 的父 imageui
方案
先查詢依賴spa
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=XXX) # XXX指鏡像IDcode
而後根據根據TAG刪除容器orm
docker rm REPOSITORY:TAGblog
補充
docker none鏡像
有效的 none 鏡像
Docker文件系統的組成,docker鏡像是由不少 layers組成的,每一個 layer之間有父子關係,全部的docker文件系統層默認都存儲在/var/lib/docker/graph目錄下,docker稱之爲圖層數據庫。
最後作一個總結< none>:< none> 鏡像是一種中間鏡像,咱們可使用docker images -a來看到,他們不會形成硬盤空間佔用的問題(由於這是鏡像的父層,必須存在的),可是會給咱們的判斷帶來迷惑。
無效的 none 鏡像
另外一種類型的 < none>:< none> 鏡像是dangling images ,這種類型會形成磁盤空間佔用問題。
像Java和Golang這種編程語言都有一個內存區,這個內存區不會關聯任何的代碼。這些語言的垃圾回收系統優先回收這塊區域的空間,將他返回給堆內存,因此這塊內存區對於以後的內存分配是有用的
docker的懸掛(dangling)文件系統與上面的原理相似,他是沒有被使用到的而且不會關聯任何鏡像,所以咱們須要一種機制去清理這些懸空鏡像。
咱們在上文已經提到了有效的< none>鏡像,他們是一種中間層,那無效的< none>鏡像又是怎麼出現的?這些 dangling鏡像主要是咱們觸發 docker build 和 docker pull命令產生的。
使用下面的命令能夠清理docker rmi $(docker images -f 「dangling=true」 -q)docker沒有自動垃圾回收處理機制,將來可能會有這方面的改進,可是目前咱們只能這樣手動清理(寫個腳本就好)。