无法删除具有依赖子映像的docker映像

283

我正在尝试

docker rmi c565603bc87f

错误:

来自守护程序的错误响应: 冲突: 无法删除c565603bc87f(不能被强制) - 镜像有依赖的子镜像

所以即使使用-f标志也无法删除镜像。如何删除镜像以及其所有子镜像?

Linux和docker版本:

uname -a Linux goracio-pc 4.4.0-24-generic #43-Ubuntu SMP Wed Jun 8 19:27:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

docker version 客户端: Version: 1.11.2 API version: 1.23 Go version: go1.5.4 Git commit: b9f10c9 Built: Wed Jun 1 22:00:43 2016 OS/Arch: linux/amd64

服务器: Version: 1.11.2 API version: 1.23 Go version: go1.5.4 Git commit: b9f10c9 Built: Wed Jun 1 22:00:43 2016 OS/Arch: linux/amd64


也许这个可以帮助:https://gist.github.com/Siva-Charan/db7bd84ad2ca2b0779d87a75e6bb4176 - Gujarat Santana
2
从最新到最旧按标签删除。如果它们存在于存储库中,则在任何Dockerfile需要它们时将被拉取。 - rafaelbattesti
你应该接受Nguyen提供的(非常好的)答案。 - jpw
25个回答

211
在某些情况下(比如我的情况),您可能正在尝试通过指定具有多个标签的图像ID来删除图像,而您可能没有意识到这些标签的存在,其中一些标签可能被其他图像使用。在这种情况下,您可能不想删除该图像。
如果您的情况存在冗余标签,请使用docker rmi <repo:tag>命令而不是docker rmi <image_id>来删除您希望移除的冗余标签。

30
“docker rmi repo:tag”对我很有用。你提供的解决方案相对其他答案来说比较简单,谢谢。 - Shihe Zhang
这应该是我远程使用旧版Golang镜像的正确方式。 - temple
这对我来说是个解决方案,谢谢。未标记:drud/ddev-webserver:20200301_leymannx_apache-junk-built - rfay
如果有人安装了微软的 eShopOnContainers 示例,那么你必须按照 repo:tag 的方式删除每个示例,因为它会创建八个标记图像,仅共享两个图像 ID。即使是 Visual Studio 在其容器管理窗口中也无法删除它们... - mdisibio
3
命令 docker rmi <repo:tag> 只是 取消标记 而已,它并不一定会删除镜像。如果有多个标记引用此镜像,或者存在其他问题(例如 OP 所述的问题),则该镜像仍将存在。您可以使用命令 docker images ls --all 检查该镜像是否仍然存在。 - twan163
@twan163 我想你是指 docker image ls --all(而不是 imageS),对吗? - Redoman

184

在删除图像之前,应尝试删除不必要的图像:

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

然后,运行:

docker rmi c565603bc87f

23
没有任何悬空的镜像...docker images -f dangling=true --> 什么都没有 - YakovlevRoman
69
这个回答是回答一个不同的问题“如何删除悬空图片?”提问者的问题是“如何删除依赖图片?” - tudor -Reinstate Monica-
11
еҸӘйңҖдҪҝз”Ёpruneе‘Ҫд»ӨеҚіеҸҜжё…йҷӨжӮ¬з©әй•ңеғҸгҖӮ - Deqing
30
该命令不再起作用:> "docker rmi"命令至少需要一个参数。 - samayo
3
@samayo 如果你遇到了这个错误,请尝试将过滤器部分更改为:--filter=dangling=true。如果你仍然遇到了这个错误,那就意味着你没有任何悬空的镜像,因此该in-set命令会评估为空字符串。 - HammerN'Songs
显示剩余6条评论

92

所有之前的答案都是正确的,但这里有一个解决方案,就是强制删除所有图片(请自行承担风险,它将删除您所有的图片)。

docker rmi $(docker images -q) -f

在这里输入图片描述


3
这对我有用,我只是想要清除所有我的本地镜像。 请注意,我不得不更新以适应我的Docker版本(18.09.7): docker image rm $(docker image ls -a -q) -f - akagixxer
你所有没有运行容器的图像... 这真的非常有用。 - Derek Adair

75

使用以下方法查找所有在问题图像创建后创建的图像的图像ID和父级ID:

docker inspect --format='{{.Id}} {{.Parent}}' $(docker images --filter since=<image_id> -q)

然后您调用命令:

docker rmi {sub_image_id} 

"sub_image_id"是依赖图像的ID


删除特定图像的中间图像很好。谢谢! - A.Villegas
1
未知标志 -filter :/ - SamuraiJack
5
这似乎是针对问题的实际解决方案! - Paolo
4
以下是一行代码实现的方法:docker inspect --format='{{.Id}} {{.Parent}}' $(docker images --filter since=65f9b4839725 -q) | cut -d' ' -f1 | cut -d: -f2 | xargs docker rmi注意,这行代码的作用是删除符合条件的镜像,执行前请确保您了解该命令的含义并谨慎操作。 - Matt Friedman
这是正确的解决方案。 - wasserholz
显示剩余2条评论

35

对我有用的是使用REPOSITORY:TAG组合而不是IMAGE ID。

当我尝试使用命令docker rmi <IMAGE ID>删除没有与该镜像关联的容器的Docker镜像时,我收到了以下消息:

$ docker rmi 3f66bec2c6bf
Error response from daemon: conflict: unable to delete 3f66bec2c6bf (cannot be forced) - image has dependent child images

当我使用命令 docker rmi RPOSITORY:TAG 时,我能够成功删除。

$ docker rmi ubuntu:18.04v1
Untagged: ubuntu:18.04v1

1
确实。有什么解释为什么会出现这种奇怪的行为吗? - RodrigoM
1
这对我也起作用了。在我的情况下,我有一个过时的Ubuntu镜像,它没有被任何其他镜像引用为父级,但仍然无法删除。docker rmi 93fd78260bd1失败了,但是docker tag 93fd78260bd1 ubuntu:temp && docker rmi ubuntu:temp成功了。 - Thomas Lobker
为我工作,同时也在更新一个过时的图像。有人知道为什么它会失败w id吗? - strider
4
这并不真正删除图片。它只是为该图片删除了一个重复的标签(因此会出现“Untagged: ubuntu:18.04v1”的消息)。如果你执行“docker images -a”命令,你可能仍然会看到“3f66bec2c6bf”的列表。如果该图片被真正删除了,你将会收到“Deleted: 3f66bec2c6bf”的消息。 - wisbucky
似乎在没有标签的情况下也无法工作,就像错误地将容器提交为与原始图像相同名称和标签的图像一样(糟糕!) - guitarpicva

27

此命令会删除所有图片(使用时请谨慎)

您尝试过使用 --force 吗?

sudo docker rmi $(sudo docker images -aq) --force

即使我遇到了同样的问题,上述代码也能完美运行。


2
我在两个地方都没有使用sudo,这对我来说非常有效。 - user2217751
它终于起作用了,但是否有更“精准”的方法可以获得相同的结果? - readyready15728
1
我相信更精确的做法不是使用sudo创建Docker镜像 :) - Dapter20

14

如果你想要取消标记Docker镜像

docker rmi <rep:tag>

如果您想要删除Docker镜像

docker image rm <image_id>

例如:输入docker image ls命令以显示镜像信息。

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              3.6            60f85556d5d2        4 days ago          174MB

删除Python 3.6镜像: docker rmi python:3.6

通过ID删除镜像:docker image rm 60f85556d5d2


在这种情况下,这不仅会取消标记,而不是删除吗? - manojlds

12

9
你已经详细写好这个剧本了吗? - TT.
1
我已经在下面的脚本中详细说明了。 - lmat - Reinstate Monica

9
这是一个脚本,可删除一张图片及其所有相关的图片。
#!/bin/bash

if [[ $# -lt 1 ]]; then
    echo must supply image to remove;
    exit 1;
fi;

get_image_children ()
{
    ret=()
    for i in $(docker image ls -a --no-trunc -q); do
        #>&2 echo processing image "$i";
        #>&2 echo parent is $(docker image inspect --format '{{.Parent}}' "$i")
        if [[ "$(docker image inspect --format '{{.Parent}}' "$i")" == "$1" ]]; then
            ret+=("$i");
        fi;
    done;
    echo "${ret[@]}";
}

realid=$(docker image inspect --format '{{.Id}}' "$1")
if [[ -z "$realid" ]]; then
    echo "$1 is not a valid image.";
    exit 2;
fi;
images_to_remove=("$realid");
images_to_process=("$realid");
while [[ "${#images_to_process[@]}" -gt 0 ]]; do
    children_to_process=();
    for i in "${!images_to_process[@]}"; do
        children=$(get_image_children "${images_to_process[$i]}");
        if [[ ! -z "$children" ]]; then
            # allow word splitting on the children.
            children_to_process+=($children);
        fi;
    done;
    if [[ "${#children_to_process[@]}" -gt 0 ]]; then
        images_to_process=("${children_to_process[@]}");
        images_to_remove+=("${children_to_process[@]}");
    else
        #no images have any children. We're done creating the graph.
        break;
    fi;
done;
echo images_to_remove = "$(printf %s\n "${images_to_remove[@]}")";
indices=(${!images_to_remove[@]});
for ((i="${#indices[@]}" - 1; i >= 0; --i)) ; do
    image_to_remove="${images_to_remove[indices[i]]}"
    if [[ "${image_to_remove:0:7}" == "sha256:" ]]; then
        image_to_remove="${image_to_remove:7}";
    fi
    echo removing image "$image_to_remove";
    docker rmi "$image_to_remove";
done

8

尝试删除图片编号:b721d1cdaac7

docker rmi b721d1cdaac7 -f

回复:守护进程错误响应:冲突:无法删除b721d1cdaac7(无法强制)-该镜像具有依赖的子镜像。

要删除所有子镜像,请运行以下命令:

  docker image rm $(docker images --filter since=b721d1cdaac7 -q) -f

首先将取消标记并删除所有子图像。


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