无法删除带孩子的图片

Rom*_*man 119 docker docker-image

我在尝试

docker rmi c565603bc87f
Run Code Online (Sandbox Code Playgroud)

错误:

来自守护程序的错误响应:冲突:无法删除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客户端:版本:1.11.2 API版本:1.23 Go版本:go1.5.4 Git commit:b9f10c9内置:Wed Jun 1 22:00:43 2016 OS/Arch:linux/amd64

服务器:版本:1.11.2 API版本:1.23 Go版本:go1.5.4 Git commit:b9f10c9内置:Wed Jun 1 22:00:43 2016 OS/Arch:linux/amd64

Ngu*_*Son 81

在删除图像之前,您应该尝试删除不需要的图像:

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
Run Code Online (Sandbox Code Playgroud)

之后:

docker rmi c565603bc87f
Run Code Online (Sandbox Code Playgroud)

  • 这个答案回答了另一个问题"如何删除悬空图像?" OP的问题是"如何删除依赖图像?" (22认同)
  • 该命令不再起作用:`>"docker rmi"至少需要1个参数 (11认同)
  • 没有任何悬空图像...泊机图像-f dangling = true - >没什么 (7认同)
  • 要删除悬空图像,只需使用`prune` (6认同)
  • @samayo 如果您遇到该错误,请尝试将过滤器部分更改为:`--filter=dangling=true`。如果您仍然遇到该错误,则仅意味着您没有任何悬空图像,因此 in-set 命令的计算结果为空字符串。 (2认同)
  • 答案与所提出的问题无关。它不是关于悬挂图像,而是关于依赖图像 (2认同)

bba*_*ker 51

在某些情况下(比如我的情况),您可能会尝试通过指定具有多个您未实现的标记的图像ID来删除图像,其中一些标记可能被其他图像使用.在这种情况下,您可能不想删除图像.

如果您有如此处所述的冗余标签,请docker rmi <image_id>使用docker rmi <repo:tag>您想要删除的冗余标签.

  • docker rmi &lt;repo:tag&gt;对我有用。您的解决方案在这些答案中非常简单,谢谢。 (3认同)
  • 命令 `docker rmi &lt;repo:tag&gt;` 仅 _untags_,它不一定会删除镜像。如果有多个标签引用该图像,或者存在另一个问题(例如 OP 中所述的问题),则该图像仍将存在。您可以使用命令“docker images ls --all”检查映像是否仍然存在。 (3认同)

小智 30

使用以下内容查找在相关图像之后创建的所有图像的图像ID和父ID:

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

然后你调用命令:

docker rmi {sub_image_id} 
Run Code Online (Sandbox Code Playgroud)

"sub_image_id"是从属图像的ID

  • 这似乎是问题的实际解决方案! (4认同)
  • 以下是如何在一行中完成此操作: ```docker inform --format='{{.Id}} {{.Parent}}' $(docker images --filtersince=65f9b4839725 -q) | 切 -d' ' -f1 | 剪切-d:-f2 | xargs docker rmi``` (2认同)

gre*_*pit 23

所有以前的答案都是正确的,但这里只是一个解决方案,它只是强行删除你的所有图像(使用此命令需要您自担风险将删除所有图像)

docker rmi $(docker images -q) -f
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 这对我有用;我只是想毁掉我所有的本地形象。注意,我必须更新才能使用我的 docker 版本(18.09.7): `docker image rm $(docker image ls -a -q) -f` (3认同)

Edu*_*sta 20

对我有用的是使用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
Run Code Online (Sandbox Code Playgroud)

当我使用命令时,我可以成功删除 docker rmi RPOSITORY:TAG

$ docker rmi ubuntu:18.04v1
Untagged: ubuntu:18.04v1
Run Code Online (Sandbox Code Playgroud)

  • 这并没有真正删除图像。它只是删除该图像的重复标签(因此出现消息“Untagged: ubuntu:18.04v1”)。如果您执行“docker images -a”,您可能会看到“3f66bec2c6bf”仍然列出。如果图像确实被删除,您将收到消息“已删除:3f66bec2c6bf” (4认同)

小智 14

该命令删除了所有图像(小心使用)

您是否尝试过使用--force

sudo docker rmi $(sudo docker images -aq) --force
Run Code Online (Sandbox Code Playgroud)

上面的代码运行起来就像一个魅力,即使我也遇到了同样的问题

  • 要提及的是,此命令将删除所有图像 (11认同)
  • 我在两个地方都放弃了 sudo,这对我来说非常有用 (2认同)

Cam*_*uoi 12

如果你想 Untag Docker Images

docker rmi <rep:tag>
Run Code Online (Sandbox Code Playgroud)

如果你想 Removing Docker Images

docker image rm <image_id>
Run Code Online (Sandbox Code Playgroud)

例如:键入docker image ls以显示图像信息

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              3.6            60f85556d5d2        4 days ago          174MB
Run Code Online (Sandbox Code Playgroud)

码头工人 rmi 蟒蛇:3.6

泊坞窗图像 rm 60f85556d5d2


小智 8

尝试删除图像 ID:b721d1cdaac7

docker rmi b721d1cdaac7 -f
Run Code Online (Sandbox Code Playgroud)

响应:来自守护程序的错误响应:冲突:无法删除 b721d1cdaac7(无法强制)- 映像具有依赖的子映像

要删除所有子图像命令:

  docker image rm $(docker images --filter since=b721d1cdaac7 -q) -f
Run Code Online (Sandbox Code Playgroud)

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


tu-*_*duh 6

答案是找到所有后代孩子,这里有答案:

码头工人如何获取相关子图像列表?

然后使用它按顺序删除子图像。

  • 你把这个脚本充实了吗? (9认同)

Lim*_*ent 6

这是一个删除图像的脚本以及依赖它的所有图像.

#!/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
Run Code Online (Sandbox Code Playgroud)


cam*_*ino 6

# docker rm $(docker ps -aq)
Run Code Online (Sandbox Code Playgroud)

之后使用 Nguyen 建议的命令。


slu*_*shy 5

建立在西蒙·布雷迪的蛮力方法在这里,如果你没有一吨的图片,你可以使用此外壳功能:

recursive_remove_image() {
  for image in $(docker images --quiet --filter "since=${1}")
  do
    if [ $(docker history --quiet ${image} | grep ${1}) ]
    then
      recursive_remove_image "${image}"
    fi
  done
  echo "Removing: ${1}"
  docker rmi -f ${1}
}
Run Code Online (Sandbox Code Playgroud)

然后使用recursive_remove_image <image-id>.


Aam*_*man 5

请运行此 docker 命令

  1. docker image rm -f $(docker image ls --filter dangling=true -q)

然后运行

  1. docker image rm -f $(docker image ls -a -q)

经过几个小时的工作后,我发现上述命令非常有帮助。

  1. 否则,您可以运行修剪脚本。 https://gist.github.com/sethbergman/cb0f1f700b1f6474b9738191055c9fb7