首页 文章

无法删除带孩子的图片

提问于
浏览
52

我在尝试

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客户端:版本: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

15 回答

  • 1

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

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

    之后:

    docker rmi c565603bc87f
    
  • 1

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

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

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

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

    docker rmi #ImageId

  • 5

    你可以这样做:

    ➜〜须藤泊坞窗RMI 4ed13257bb55 -f删除:SHA256:4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358删除:SHA256:4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3删除:SHA256:96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69删除:SHA256:d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded

  • 39

    假设我们有一个Dockerfile

    FROM ubuntu:trusty
    CMD ping localhost
    

    我们从没有TAG或命名的构建图像

    docker build .
    

    现在我们有一个成功报告“Successfully built 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
    
  • 4

    基于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 <image-id> 调用它 .

  • 1

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

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

  • 6

    你有没有尝试过使用--force

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

    以上代码运行就像魅力甚至doe我有同样的问题

  • 1

    在某些情况下(如我的情况),您可能正在尝试删除您没有意识到的图像 by specifying the image id that has multiple tags ,其中一些图像可能被其他图像使用 . 在这种情况下, you man not want to remove the image .

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

  • 1

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

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

    然后你调用命令:

    docker rmi {sub_image_id}
    

    “sub_image_id”是从属图像的ID

  • 9

    对我有用的是使用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

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

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

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

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

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

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

    希望在某些时候帮助别人 .

  • 3

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

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

    当我想在docker中删除名称为 "<none>" 的一些未使用的图像时我面对问题 unable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child images .So来解决这个问题:

    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:最新和不同的容器名称 . 所以,我杀死并删除所有容器的“javaapp:latest”容器:

    sudo docker stop“containerName”sudo docker rm“containrName”

    然后

    sudo docker rmi -f“imageId”

    所以我可以删除名称为 "<none>" 的所有图像

    祝好运

  • 0

    所有以前的答案都是正确的,但这里有一个解决方案,只是强行删除你的所有图像( use this command at your own risk it will delete all of your images

    docker rmi $(docker images -q) -f
    

    enter image description here

  • 0

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

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

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

相关问题