删除具有依赖子镜像的Docker镜像

3
我想要删除docker镜像,但是我遇到了以下错误信息:
错误响应来自守护程序:冲突:无法删除47bcc53f74dc(无法强制执行)-镜像具有依赖的子镜像
我通过docker stop $(docker ps -a -q)命令停止了所有容器。之后,我通过docker rmi $(docker images | grep "busybox" | awk '{print $3}')命令删除了所有busybox镜像。但是,我遇到了上述错误信息。
我使用docker images | grep busybox命令并获取以下信息:
busybox             1                   47bcc53f74dc        6 months ago        1.113 MB
busybox             1-uclibc            47bcc53f74dc        6 months ago        1.113 MB
busybox             1.24                47bcc53f74dc        6 months ago        1.113 MB
busybox             1.24-uclibc         47bcc53f74dc        6 months ago        1.113 MB
busybox             1.24.2              47bcc53f74dc        6 months ago        1.113 MB
busybox             1.24.2-uclibc       47bcc53f74dc        6 months ago        1.113 MB
busybox             uclibc              47bcc53f74dc        6 months ago        1.113 MB

我该如何删除 busybox 镜像?谢谢您的建议。
1个回答

2
警告提示您,一些容器仍然链接(继承)了您要删除的docker FS层。没有选项可以在不基于这些层重新创建子映像的情况下删除中间的docker文件系统层。
比如,你有如下配置:
base_layer_A -> base_layer_B
           \        \_ child_layer_D
            \__ container C

如果您想删除容器C和层A,则不能这样做(因为层B基于层A)。 这可能是您的问题最有可能的原因。

PS:docker images -a可能会对您有所帮助(但不大可能)。 曾经有一个“ -tree”开关可以帮助解决这种情况,但不幸的是它现在已经消失了。


以下是清理废弃的Docker容器和过时的映像层的直接和粗暴方法:

#!/usr/bin/env bash
set -euo pipefail

for c in $(docker ps -a -f status=exited -f status=created -f status=dead --format="{{.ID}}"); do
    docker rm $c
done
for img in $(docker images -f dangling=true --format="{{.ID}}"); do
    docker rmi $img
done

哦,我试了一下你的命令。有没有办法找到相关图片并手动删除它们呢?谢谢。 - tmquang6805
有一些简单的方法可以删除与任何内容无关的图像层(只需使用几个匹配“none”标记的命令即可完成)。至于显示Docker图像层树 - 以前有一个命令可以呈现这样的树形结构(就像我之前提到的'--tree'),但是现在已经被删除了,我不知道是否还有类似的命令。很遗憾,我自己也想知道是否有这样的命令。 - agg3l
您可以开始分析正在运行/启用的Docker容器(使用docker ps -a命令),杀死其中的进程或者终止整个容器。 - agg3l
您的命令可以删除孤立的图层,但并不能解决问题(rmi -f 仍因有依赖镜像而返回失败)。 - some bits flipped

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接