【问题标题】:Can’t delete docker image with dependent child images无法删除具有依赖子图像的 docker 图像
【发布时间】:2016-11-02 07:04:02
【问题描述】:

我在努力

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

码头工人版本 客户: 版本:1.11.2 API版本:1.23 围棋版本:go1.5.4 Git 提交:b9f10c9 建成:2016 年 6 月 1 日星期三 22:00:43 操作系统/架构:linux/amd64

服务器: 版本:1.11.2 API版本:1.23 围棋版本:go1.5.4 Git 提交:b9f10c9 建成:2016 年 6 月 1 日星期三 22:00:43 操作系统/架构:linux/amd64

【问题讨论】:

标签: docker docker-image


【解决方案1】:

在某些情况下(例如我的情况),您可能会尝试通过指定具有多个标签的图像 id 来删除图像由其他图像。在这种情况下,您可能不想删除图片

如果您遇到此处描述的冗余标签的情况,请在要删除的冗余标签上使用 docker rmi <image_id> 而不是 docker rmi <repo:tag>

【讨论】:

  • docker rmi <repo:tag> 为我工作。在这些答案中,您的解决方案非常简单,谢谢。
  • 对于我的远程旧 golang 图像来说,这应该是正确的方法
  • 这是给我的票,谢谢。 Untagged: drud/ddev-webserver:20200301_leymannx_apache-junk-built
  • 如果有人安装了 Microsoft 的eShopOnContainers 示例,您绝对必须通过repo:tag 以这种方式删除每个示例,因为它会创建八个仅共享两个图像 ID 的标记图像。甚至 Visual Studio 也不会在其容器管理窗口中删除它们...
  • 命令docker rmi <repo:tag>untags,不一定删除图片。如果有多个标签引用此图像,或者存在其他问题,例如OP所说的那个,图像仍然存在。您可以使用命令docker images ls --all 来检查图像是否仍然存在。
【解决方案2】:

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

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

之后,运行:

docker rmi c565603bc87f

【讨论】:

  • 没有任何悬空图像 ... docker images -f dangling=true --> 没有
  • 这个答案正在回答另一个问题“如何删除悬空图像?” OP 的问题是“如何删除依赖图像?”
  • 要删除悬空图像,只需使用prune
  • 该命令不再起作用:> "docker rmi" requires at least 1 argument.
  • @samayo 如果您遇到该错误,请尝试将过滤器部分更改为:--filter=dangling=true。如果您仍然收到该错误,那仅表示您没有任何悬空图像,因此 in-set 命令的计算结果为空字符串。
【解决方案3】:

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

docker rmi $(docker images -q) -f

【讨论】:

  • 这对我有用;我只是想吹走我所有的本地图像。请注意,我必须更新才能使用我的 docker 版本(18.09.7):docker image rm $(docker image ls -a -q) -f
  • 所有没有运行容器的图像...这真的很有用。
【解决方案4】:

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

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

然后你调用命令:

docker rmi {sub_image_id} 

“sub_image_id”是依赖图像的ID

【讨论】:

  • 删除特定图像的中间图像非常好。谢谢!!
  • 未知标志 --filter :/
  • 这似乎是问题的实际解决方案!
  • 以下是您可以在一行中执行此操作的方法:docker inspect --format='{{.Id}} {{.Parent}}' $(docker images --filter since=65f9b4839725 -q) | cut -d' ' -f1 | cut -d: -f2 | xargs docker rmi
  • 这是正确的解决方案
【解决方案5】:

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

当我尝试使用命令 docker rmi &lt;IMAGE ID&gt; 删除一个没有与该图像关联的容器的 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

【讨论】:

  • 确实如此。有什么解释为什么会出现这种奇怪的行为吗?
  • 这对我也有用。就我而言,我有一个过时的 Ubuntu 映像,它没有在任何其他映像中作为父级引用,但仍然无法删除。 docker rmi 93fd78260bd1 失败,但随后 docker tag 93fd78260bd1 ubuntu:temp &amp;&amp; docker rmi ubuntu:temp 成功。
  • 为我工作,也在更新一个过时的图像。有人知道为什么它会失败吗?
  • 这并没有真正删除图像。它只是删除了该图像的重复标签(因此消息Untagged: ubuntu:18.04v1)。如果您执行docker images -a,您可能会看到3f66bec2c6bf 仍然列出。如果图片真的被删除了,你会收到消息Deleted: 3f66bec2c6bf
【解决方案6】:

此命令会删除所有图像(谨慎使用)

你是否尝试过使用--force

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

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

【讨论】:

  • 我在这两个地方都没有使用 sudo,它对我来说效果很好
  • 它终于奏效了,但是还有什么更“外科手术”可以得到相同的结果吗?
  • 我相信更多的手术不是使用 sudo 创建 docker 图像 :)
【解决方案7】:

如果你想Untag Docker Images

docker rmi <rep:tag>

如果你想Removing Docker Images

docker image rm <image_id>

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

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

docker rmi python:3.6

docker 镜像 rm 60f85556d5d2

【讨论】:

  • 在这种情况下不只是取消标记而不是删除吗?
【解决方案8】:

这是一个删除图像和依赖它的所有图像的脚本。

#!/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

【讨论】:

    【解决方案9】:

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

    docker how can I get the list of dependent child images?

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

    【讨论】:

    • 你充实这个脚本了吗?
    • 我继续在下面的脚本中充实了它。
    【解决方案10】:
    # docker rm $(docker ps -aq)
    

    然后按照 Nguyen 的建议使用命令。

    【讨论】:

    • 这不起作用。此命令删除所有容器。但是镜像可能仍然有依赖的子镜像:例如,如果被删除的镜像是 Docker 构建的中间镜像。
    【解决方案11】:

    基于 Simon Brady 的蛮力方法here,如果您没有大量图像,您可以使用这个 shell 函数:

    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}
    }
    

    然后使用recursive_remove_image &lt;image-id&gt; 调用它。

    【讨论】:

      【解决方案12】:

      尝试删除图像 ID:b721d1cdaac7

      docker rmi b721d1cdaac7 -f
      

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

      删除所有子图像命令:

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

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

      【讨论】:

        【解决方案13】:

        当我想在 docker 中删除一些名称为 "&lt;none&gt;" 的未使用图像时,我遇到了问题 unable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child images。所以解决这个问题:

        sudo docker ps -a

        CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                         PORTS                                              NAMES
        01ee1276bbe0        lizard:1                    "/bin/sh -c 'java ..."   About an hour ago   Exited (1) About an hour ago                                                      objective_lewin
        49d73d8fb023        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Up 19 hours                    0.0.0.0:8091->8091/tcp                             pedantic_bell
        405fd452c788        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           infallible_varahamihira
        532257a8b705        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           demo-default
        9807158b3fd5        javaapp:latest              "/usr/bin/java -ja..."   19 hours ago        Created                                                                           xenodochial_kilby
        474930241afa        jenkins                     "/bin/tini -- /usr..."   13 days ago         Up 4 days                      0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   myjenkins
        563d8c34682f        mysql/mysql-server:latest   "/entrypoint.sh my..."   3 weeks ago         Up 4 days (healthy)            0.0.0.0:3306->3306/tcp, 33060/tcp                  mymysql
        b4ca73d45d20        phpmyadmin/phpmyadmin       "/run.sh phpmyadmin"     4 weeks ago         Exited (0) 3 weeks ago                                                            phpmyadmin
        

        您可以看到我有几个名称为 javaapp:latest 和不同容器名称的图像。所以,我杀死并删除了“javaapp:latest”容器的所有容器:

        sudo docker stop "containerName"

        sudo docker rm "containrName"

        然后

        sudo docker rmi -f "imageId"

        所以我可以删除所有名称为"&lt;none&gt;"的图像

        祝你好运

        【讨论】:

          【解决方案14】:

          请运行这个 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

          【讨论】:

            【解决方案15】:

            扩展 @Nguyen 提供的答案 - 此函数可以添加到您的 .bashrc 等,然后从命令行调用以帮助清理任何 image has dependent child images 错误... p>

            您可以以自己的身份运行该函数,如果docker ps 失败,则它将运行带有sudodocker 命令并提示您输入密码。

            是否删除任何正在运行的容器的图像!

            docker_rmi_dependants ()                                                                                                                                                         
            { 
              DOCKER=docker
              [ docker ps >/dev/null 2>&1 ] || DOCKER="sudo docker"
            
              echo "Docker: ${DOCKER}"
            
              for n in $(${DOCKER} images | awk '$2 == "<none>" {print $3}');
              do  
                echo "ImageID: $n";
                ${DOCKER} inspect --format='{{.Id}} {{.Parent}}' $(${DOCKER} images --filter since=$n -q);
              done;
            
              ${DOCKER} rmi $(${DOCKER} images | awk '$2 == "<none>" {print $3}')
            }
            

            我的.bashrc 文件中也有这个...

            docker_rm_dangling ()  
            { 
              DOCKER=docker
              [ docker ps >/dev/null 2>&1 ] || DOCKER="sudo docker"
            
              echo "Docker: ${DOCKER}"
            
              ${DOCKER} images -f dangling=true 2>&1 > /dev/null && YES=$?;                                                                                                                  
              if [ $YES -eq 1 ]; then
                read -t 30 -p "Press ENTER to remove, or CTRL-C to quit.";
                ${DOCKER} rmi $(${DOCKER} images -f dangling=true -q);
              else
                echo "Nothing to do... all groovy!";
              fi  
            }
            

            适用于:

            $ docker --version 
            Docker version 17.05.0-ce, build 89658be
            

            【讨论】:

              【解决方案16】:

              我也遇到了这个问题,我可以用下面的命令解决这个问题。这可能是因为图像的容器正在运行或退出,因此在删除图像之前您需要删除容器

              docker ps -a -f status=exited :此命令显示所有退出的容器,然后复制容器 ID,然后运行以下命令以删除容器

              docker rm #containerId :此命令删除容器这可能是提到“图像具有依赖子图像”的问题

              然后尝试使用以下命令删除图像

              docker rmi #ImageId

              【讨论】:

                【解决方案17】:

                我遇到了这个问题,这里的简短答案都不起作用,即使在上面@tudor 提到的页面中也是如此。我想我会在这里分享我是如何摆脱这些图像的。我想出了这样的想法,依赖图像必须 >= 父图像的大小,这有助于识别它,以便我们删除它。

                我按大小列出了图像,看看是否能发现任何相关性:

                docker images --format '{{.Size}}\t{{.Repository}}\t{{.Tag}}\t{{.ID}}' | sort -h -r | column -t
                

                这样做的目的是使用 docker 中的一些特殊格式来首先定位图像大小列,然后以相反的顺序运行人类可读的排序。然后我恢复易于阅读的列。

                然后我查看了&lt;none&gt; 容器,并匹配了列表中的第一个具有相似大小的容器。我在该图像上执行了一个简单的docker rmi &lt;image:tag&gt;,所有&lt;none&gt; 子图像都随之而来。

                当我第一次开始玩 docker 时,所有子图像的问题图像实际上是该死的 myrepo/getstarted-lab image I used。这是因为我从创建链的第一个测试图像创建了一个新图像。

                希望在某些时候能对其他人有所帮助。

                【讨论】:

                  【解决方案18】:

                  正如here解释的那样,我使用以下方式识别依赖图像并删除它们,

                  image_id=123456789012
                  
                  docker images -a -q --filter since=$image_id |
                  xargs docker inspect --format='{{.Id}} {{.Parent}}'
                  

                  你会看到类似这样的输出:

                  sha256:f7ef19862215ec0bf7a6b103504d213e1c001691703808f4154689cfbb5f14f9 sha256:a7d2efad2847bd10e5223980ed80f5781c716eddbf6131a3cf97614e7f2db97f
                  sha256:03690ae141346203959d0ae1b3e8d34b7a4232095d774af57dda6282fce99cc4 sha256:5713074659bb5352496ea680a903eba2f66e0495538c9db37336f4ba92994ea8
                  sha256:311f587811942d328edc52e5953d794eb9b81fe392512080d9fc1d350a6b2024 sha256:aa674f7f2621946db257720c378377b8714739d20879542d875b84c53b59bc75
                  

                  然后您可以将这些图像一一删除,如下所示:

                  docker image rm f7ef19862215ec0bf7a6b103504d213e1c001691703808f4154689cfbb5f14f9
                  

                  输出类似下面的东西:

                  Untagged: prathap/cognitive_robotics_gpu:v1
                  Untagged: prathap/cognitive_robotics_gpu@sha256:db6e7543a13e9a96241c985b9b3145b8fd65effb68c183301385b495875f1a5a
                  Deleted: sha256:03690ae141346203959d0ae1b3e8d34b7a4232095d774af57dda6282fce99cc4
                  Deleted: sha256:263f655670436758f8e3f23f31170083fc8d60c4eebe01a5b3fda1e73bed3ad1
                  

                  【讨论】:

                    【解决方案19】:

                    假设我们有一个 Dockerfile

                    FROM ubuntu:trusty
                    CMD ping localhost
                    

                    我们在没有标签或命名的情况下构建图像

                    docker build .
                    

                    现在我们有一个成功报告“成功构建 57ca5ce94d04” 如果我们看到 docker 图像

                    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
                    <none>              <none>              57ca5ce94d04        18 seconds ago      188MB
                    ubuntu              trusty              8789038981bc        11 days ago         188MB
                    

                    我们需要先删除 docker rmi 57ca5ce94d04

                    紧随其后

                    docker rmi 8789038981bc
                    

                    该图像将被删除!

                    按照某人的建议强制删除所有内容

                    docker rmi $(docker images -q) -f
                    

                    【讨论】:

                    • 每张这样的图片我都会得到cannot be forced
                    【解决方案20】:

                    强制删除图像列表(例如,不包括版本 10)

                    码头工人图片 | grep 版本 | grep -v version10 > images.txt && for img in $( awk -F" " '{print $3}' /root/images.txt ) ;做docker rmi -f $img;完成

                    【讨论】:

                      【解决方案21】:

                      尝试删除图像 ID:b721d1cdaac7 码头工人rmi b721d1cdaac7 -f 响应:来自守护进程的错误响应:冲突:无法删除 b721d1cdaac7(无法强制)- 图像具有依赖的子图像

                      删除所有子图像 docker image rm $(docker images --filter since=b721d1cdaac7 -q) -f

                      【讨论】:

                        【解决方案22】:

                        如果使用公司代理,请确保您没有遇到速率限制错误

                        如果您碰巧使用公司代理并使用 Windows,您可能想尝试这个简单的修复方法。我发现这里有几个回复很有帮助。然而,即使在运行 docker image prune 和其他命令之后,我还是发现了之前被掩盖的可爱错误(和根本原因):“toomanyrequests: You has达到了拉取率限制......”

                        修复。

                        1. 打开 Windows 终端/DOS 提示符并输入:
                        • ipconfig/release
                        • [...]
                        • ipconfig/renew

                        这可能只是为您节省了与 IT 部门的通话/工单。 ;)

                        【讨论】:

                          【解决方案23】:

                          镜像层:存储库通常被称为镜像或容器镜像,但实际上它们由一层或多层组成。存储库中的图像层以父子关系连接在一起。每个图像层代表自身与父层之间的变化。

                          docker 构建模式使用继承。这意味着版本i 取决于版本i-1。因此,我们必须删除版本i+1 才能删除版本i。这是一个简单的依赖。

                          如果您想删除除最后一个(最新)和第一个(基本)之外的所有图像,那么我们可以使用docker save 命令导出最后一个(最新的),如下所示。

                          docker save -o <output_file> <your_image-id> | gzip <output_file>.tgz
                          

                          然后,现在,使用 image-id 删除所有图像,如下所示。

                          docker rm -f <image-id i> | docker rm -f <image i-1> | docker rm -f <image-id i-2> ... <docker rm -f <image-id i-k> # where i-k = 1
                          

                          现在,加载您保存的 tgz 图像,如下所示。

                          gzip -c <output_file.tgz> | docker load
                          

                          使用 docker ps -q 查看已加载图像的图像 ID。它没有标签和名称。您可以简单地更新标签和名称,如下所示。

                          docker tag <image_id> group_name/name:tag
                          

                          【讨论】:

                            【解决方案24】:

                            只需简单地使用:

                            docker rmi <image:tag> -f
                            

                            例如:

                            docker rmi ubuntu:latest -f 
                            

                            将删除带有标签名称latest 的图像名称ubuntu,而-f 用于强制删除。

                            对我有用

                            【讨论】:

                              【解决方案25】:

                              你可以这样做:

                              ➜ ~ sudo docker rmi 4ed13257bb55 -f 已删除:sha256:4ed13257bb5512b975b316ef482592482ca54018a7728​​ea1fc387e873a68c358 已删除:sha256:4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 已删除:sha256:96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 已删除:sha256:d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded

                              【讨论】:

                                猜你喜欢
                                • 2017-02-22
                                • 1970-01-01
                                • 2017-07-03
                                • 1970-01-01
                                • 1970-01-01
                                • 2019-10-24
                                • 2017-11-29
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多