无法删除具有依赖子映像的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个回答

7
# docker rm $(docker ps -aq)

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


这个不起作用。这个命令会删除所有容器。但是镜像可能仍然有依赖的子镜像:例如,如果要删除的镜像是 Docker 构建的中间镜像。 - GolDDranks

5

5

在 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_remove_image <image-id> 调用它。


3

当我想要在Docker中删除一些名称为"<none>"的未使用镜像时,我遇到了问题无法删除a354bbc7c9b7(无法强制) - 镜像具有依赖的子级镜像。因此,为解决这个问题:

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"

然后,我使用以下命令删除所有名称为"<none>"的图像:

sudo docker rmi -f "imageId"

祝您好运!

3

此处所述,我使用以下方式来识别依赖的镜像并删除它们:

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

2
将@Nguyen提供的答案进行扩展 - 可以将此功能添加到您的.bashrc等文件中,然后从命令行调用它,以帮助清除任何image has dependent child images错误...。
您可以使用自己的身份运行该函数,如果docker ps失败,则会使用sudo运行docker命令,并提示您输入密码。 不要删除任何正在运行容器的镜像!
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

1
尝试删除图像 id: b721d1cdaac7
 docker rmi b721d1cdaac7 -f

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

要删除所有子镜像

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

运行第二个命令时请小心,它不会删除所有子图像(或依赖图像),而是删除自父级图像创建以来的所有图像。 - Prasannjeet Singh

1
我也遇到了这个问题,我使用以下命令解决了问题。可能的原因是,镜像的容器正在运行或已退出,因此在删除镜像之前需要先删除容器。
docker ps -a -f status=exited:此命令显示所有已退出的容器,然后复制容器 ID,然后运行以下命令以删除容器。
docker rm #containerId:此命令删除容器,可能会出现“镜像具有依赖的子镜像”的问题。
然后尝试使用以下命令删除镜像。
docker rmi #ImageId

1
我遇到了这个问题,这里的所有简短回答都没有用,即使在@tudor提到的页面上也是如此。我想在这里分享一下我是如何去掉图片的。我想到一个主意,即相关图片必须>=父级图片的大小,这有助于识别它,以便我们可以删除它。
我按大小顺序列出了图片,看看是否能发现任何相关性:
docker images --format '{{.Size}}\t{{.Repository}}\t{{.Tag}}\t{{.ID}}' | sort -h -r | column -t

这个操作使用了docker的特殊格式来定位图像大小列,然后进行人类可读的反向排序。然后我恢复了易于阅读的列。
接下来我查看了“”容器,并将列表中的第一个与相似大小的容器匹配。我对该镜像执行了简单的“docker rmi ”,所有“”子镜像也随之删除。
问题镜像及其所有子镜像实际上是该死的“myrepo/getstarted-lab” 我最开始使用的镜像,当我开始尝试使用docker时,因为我从第一个测试镜像创建了一个新的镜像,这就形成了链式结构。
希望这能在某个时刻帮助到其他人。

0

强制删除一组图像(例如排除版本10)

docker images | grep version | grep -v version10 > images.txt && for img in $(awk -F" " '{print $3}' /root/images.txt); do docker rmi -f $img; done


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