Can’;t删除具有从属子映像的docker映像

Can’;t删除具有从属子映像的docker映像,docker,docker-image,Docker,Docker Image,我正在努力 docker rmi c565603bc87f 错误: 来自守护程序的错误响应:冲突:无法删除c565603bc87f (无法强制)-映像具有从属子映像 所以即使使用-f标志,我也不能删除图像。那么如何删除图像及其所有子图像呢 Linux和docker版本: 联阿援助团 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 rmi c565603bc87f
错误:

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

所以即使使用-f标志,我也不能删除图像。那么如何删除图像及其所有子图像呢

Linux和docker版本:

联阿援助团 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版本 客户: 版本:1.11.2 API版本:1.23 Go版本:go1.5.4 Git提交:b9f10c9 建造时间:2016年6月1日星期三22:00:43 OS/Arch:linux/amd64

服务器: 版本:1.11.2 API版本:1.23 Go版本:go1.5.4 Git提交:b9f10c9 建造时间:2016年6月1日星期三22:00:43
OS/Arch:linux/amd64

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

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
之后,运行:

docker rmi c565603bc87f

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


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

查找在相关图像之后创建的所有图像的图像id和父id,并执行以下操作:

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

“sub_image_id”是从属映像的id

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

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

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

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


docker rmi#ImageId

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

docker images | grep version | grep-v version10>images.txt&&for img,单位为$(awk-F”“{print$3}'/root/images.txt);docker rmi -f$img;完成


下面是一个脚本,用于删除一个图像以及依赖它的所有图像

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

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

我将图像按大小列出,以查看是否可以发现任何相关性:

docker images --format '{{.Size}}\t{{.Repository}}\t{{.Tag}}\t{{.ID}}' | sort -h -r | column -t
这样做的目的是,首先使用docker提供的一些特殊格式来定位图像大小列,然后以相反的顺序运行人类可读的排序。然后我恢复易于阅读的列

然后我查看了
容器,并将列表中的第一个容器与相似的大小进行了匹配。我对该图像执行了一个简单的
docker rmi
,所有的
子图像都跟着执行

所有子映像的问题映像实际上是我第一次开始玩docker时那该死的
myrepo/GetStartedLab
。这是因为我从创建链的第一个测试图像创建了一个新图像

希望这能在某些方面帮助其他人

在某些情况下(如我的情况),您可能试图通过指定包含多个标记的图像id来删除图像,而您没有意识到这些标记存在,其中一些可能被其他图像使用。在这种情况下,您可能不想删除图像


如果您有如本文所述的冗余标记的情况,请在要删除的冗余标记上使用
docker rmi
而不是
docker rmi

当我要删除docker中名为
的未使用图像时,
我面临的问题是
无法删除a354bbc7c9b7(无法强制)-图像具有从属子图像
。因此,要解决此问题:

sudo docker ps-a

您可以看到,我有几个名为javaapp:latest和其他容器名的图像。因此,我杀死并移除了“javaapp:latest”容器的所有容器:

sudo docker停止“集装箱名称”

sudo docker rm“containerName”

然后

sudo docker rmi-f“imageId”

因此,我可以删除所有名为“


goodluck

前面的所有答案都是正确的,但这里有一个解决方案,就是强制删除您的所有图像(使用此命令的风险由您自己承担,它将删除您的所有图像


假设我们有一个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 $(docker images -q) -f

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

你试过使用武力吗


上面的代码运行得很有魅力,即使doe我也有同样的问题

基于Simon Brady的暴力方法,如果你没有大量的图像,你可以使用这个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\u remove\u image

调用它。对我来说,有效的方法是使用存储库:标记组合,而不是图像ID

当我尝试使用命令
docker rmi
删除没有与此图像关联的容器的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
您可以这样做:

➜ ~ sudo docker rmi 4ed13257bb55-f 已删除:sha256:4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 已删除:sha256:4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 已删除:sha256:96DF41D1CE6065CF75D05873FB1F9EA9FED0CA86ADDCEC7722200ED3484C69
已删除:sha256:D95EFE864C7096C38757B80FDDAD12819FFFD68AC3C73333EBFFAA42385FDED图像层:存储库通常被称为图像或容器图像,但实际上它们由一个
docker rmi $(docker images -q) -f
sudo docker rmi $(sudo docker images -aq) --force
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}
}
$ docker rmi 3f66bec2c6bf
Error response from daemon: conflict: unable to delete 3f66bec2c6bf (cannot be forced) - image has dependent child images
$ docker rmi ubuntu:18.04v1
Untagged: ubuntu:18.04v1
docker save -o <output_file> <your_image-id> | gzip <output_file>.tgz
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
gzip -c <output_file.tgz> | docker load
docker tag <image_id> group_name/name:tag
# docker rm $(docker ps -aq)
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}')
}
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
docker rmi <rep:tag>
docker image rm <image_id>
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              3.6            60f85556d5d2        4 days ago          174MB
docker rmi <image:tag> -f
docker rmi ubuntu:latest -f 
docker rmi b721d1cdaac7 -f
  docker image rm $(docker images --filter since=b721d1cdaac7 -q) -f