Docker 不会将映像数据复制到每个容器,所有运行映像的容器都有一个指向文件系统该部分的只读指针(每个容器都有自己的本地 RW 层)。因此,如果您在容器使用镜像时删除镜像,您将破坏容器并覆盖它所依赖的文件系统。
相反,只需先移除容器即可。它可能会退出而不是运行,因此您可以通过docker ps -a | grep $image_id 获取运行该特定图像 ID 的容器的快速列表,但首选列表将包括任何后代:
docker rm $(docker ps -aq --filter "ancestor=747cb2d60bbe")
然后你就可以运行你的docker image rm(或docker rmi)命令了。
更新:如果您强制删除图像,docker 所做的就是取消标记它。镜像层仍然存在于文件系统中,直到容器被删除,然后您可以删除这些镜像层。例如:
/ $ docker run -d --rm busybox tail -f /dev/null
dac68c445371feab453ba3e3fc80efee52043f6b177fd0a71d0b55b38753f2cf
/ $ docker image rm busybox
Error response from daemon: conflict: unable to remove repository reference "busybox" (must force) - container dac68c445371 is using its referenced image 020584afccce
/ $ docker image rm --force busybox
Untagged: busybox:latest
Untagged: busybox@sha256:1303dbf110c57f3edf68d9f5a16c082ec06c4cf7604831669faf2c712260b5a0
/ $ docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 020584afccce 2 weeks ago 1.22MB
即使删除容器后,图层仍然存在:
/ $ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dac68c445371 020584afccce "tail -f /dev/null" 52 seconds ago Up 50 seconds brave_yalow
/ $ docker stop dac
dac
/ $ docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 020584afccce 2 weeks ago 1.22MB
但在容器被移除后,您可以清理图层:
/ $ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:020584afccce44678ec82676db80f68d50ea5c766b6e9d9601f7b5fc86dfb96d
deleted: sha256:1da8e4c8d30765bea127dc2f11a17bc723b59480f4ab5292edb00eb8eb1d96b1
Total reclaimed space: 1.22MB