Docker rmi --force命令报错咨询:删除悬空镜像场景下的正确使用方法
解决Docker悬空镜像删除失败的问题
嗨,我来帮你捋清楚这个问题哈~
首先拆解下你遇到的两个报错:
- 第一次删除时卡壳,是因为那个镜像被一个已经停止但没删掉的容器占着,Docker默认不让删被容器引用的镜像,哪怕容器已经停了。
- 后来加
--force反而报错说缺参数,是因为第一次删完部分镜像后,剩下的那个被容器占着的镜像,已经不被Docker标记为「悬空镜像」了——所以$(docker images -f "dangling=true" -q)这部分输出是空的,docker rmi自然就喊你给参数了。
给你几个靠谱的解决办法:
办法1:先清容器,再删镜像(最稳妥)
你报错里已经给出了容器ID:7e23232beaa,先把这个容器删掉:
docker rm 7e23232beaa
然后再重新跑悬空镜像删除命令就行:
docker rmi $(docker images -a --filter=dangling=true -q)
办法2:直接强制删指定镜像(跳过容器检查)
要是不想删容器,也可以直接对着那个镜像ID硬删,加--force就行:
docker rmi --force 01b2323cdc
提醒下:这么干之后,那个容器以后就启动不了了,因为它依赖的镜像没了,想清楚再操作哈。
办法3:批量强制删所有悬空镜像(不怕个别失败)
要是怕以后再遇到这种情况,可以用循环来逐个处理,就算某个镜像删失败(比如被运行中的容器占着),其他的照样能删,也不会出现参数为空的问题:
for img in $(docker images -a --filter=dangling=true -q); do docker rmi --force $img done
补充下为啥你之前的命令会报错
当你第一次删完部分悬空镜像后,剩下的那个被容器引用的镜像,Docker会因为有容器关联它,把它从「悬空镜像」列表里移除,所以你再用dangling=true过滤就查不到它了,命令替换返回空,docker rmi --force后面没东西,就报错要参数啦~
内容的提问来源于stack exchange,提问作者Blue Clouds




