在docker中,一个镜像的所有标记(TAG)都被删除,而镜像仍然还在时,我们称之为dangling状态。这种镜像,在通过docker images(或者docker image ls)时,会表现为REPOSITORYTAG都是<none>,但是IMAGE ID有效。要删除这种镜像很简单,直接执行docker image prune即可清除。

还有另外一种状态的镜像,就是其REPOSITORY是有效的,但是其TAG是<none>,这个时候这种镜像既无法通过prune清除,也无法通过常规的docker image rm来删除。那么这种镜像该怎么删除呢?

答案就是通过digest

docker images查看镜像列表时,默认是不会显示镜像的digest的。需要手动加上--digests=true参数,才能看到形如sha256:xxxxx的digest信息。这个时候,用镜像的REPOSITORY+@+digest即可精确引用到该镜像,从而删除。

比如,通过docker images --digests=true看到如下镜像:

REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE node sha256:016052a6780d578fff9ac8822e66dd483db6ffb94573028b36cdd6ea48e98082 993f38da6c6c 11 days ago 677MB

可以看到,这个node镜像,他的TAG

none

DIGEST

sha256:016052a6780d578fff9ac8822e66dd483db6ffb94573028b36cdd6ea48e98082

这个镜像无法通过docker rmi node或者docker rmi node:<none>删除。如果要删除它,需要执行

docker rmi node@sha256:016052a6780d578fff9ac8822e66dd483db6ffb94573028b36cdd6ea48e98082

方可删除该镜像。