不能删除依赖子映像的docker映像

我在努力

docker rmi c565603bc87f

错误:

daemon的错误响应:冲突:无法删除c565603bc87f (不能强制)- image有依赖的子图像

所以我不能用-f标记删除image。如何删除图像,然后所有的孩子?

Linux和docker版本:

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

< p >码头工人的版本 客户: 版本:1.11.2 API版本:1.23 Go版本:go1.5.4 Git提交:b9f10c9 建成:2016年6月1日星期三22:00:43 OS /拱:linux / amd64 < / p > < p >服务器: 版本:1.11.2 API版本:1.23 Go版本:go1.5.4 Git提交:b9f10c9 建成:2016年6月1日星期三22:00:43 OS /拱:linux / amd64 < / p >
282389 次浏览

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

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)

然后调用command:

docker rmi {sub_image_id}

sub_image_id为从属图像ID

我也有这个问题,我可以解决以下命令的问题。这可能是由于,图像的容器正在运行或退出,所以在删除图像之前,您需要删除容器

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

这个命令删除容器,这可能是提到“镜像有依赖的子图像”的问题。

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

docker rmi #ImageId

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

docker images | grep version | grep -v version10 > images.txt &为 img in $(awk -F" " '{print $3}' /root/images.txt);码头工人做rmi吗 - f img美元;做< / p >

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

#!/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中的一些特殊格式来首先定位图像大小列,然后以相反的顺序运行人类可读的排序。然后恢复易于阅读的列。

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

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

希望这能在某种程度上帮助到其他人。

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

如果你有这里描述的冗余标签的情况,在你希望删除的冗余标签上使用docker rmi <repo:tag>而不是docker rmi <image_id>

当我想删除一些未使用的图像名称"<none>"在docker我面临的问题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:最新和不同的容器名称。因此,我杀死并删除了“javaapp:latest”的所有容器;容器:

sudo docker stop“containername”;

sudo docker rm“containrname”;

然后

sudo docker rmi -f;imageId"

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

古德勒克

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

docker rmi $(docker images -q) -f

enter image description here

假设我们有一个Dockerfile

FROM ubuntu:trusty
CMD ping localhost

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

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 < / p >

紧随其后的是

docker rmi 8789038981bc

由该图像将被删除!

某人建议的强制迁移

docker rmi $(docker images -q) -f

该命令删除所有图像(请谨慎使用)

你试过用武力吗

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

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

基于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>调用它。

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

你可以这样做:

➜~ sudo docker rmi 4ed13257bb55 -f 删除:sha256:4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 删除:sha256:4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 删除:sha256:96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 删除:sha256: d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded < / p >

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

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

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

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

然后,现在,删除所有的图像使用照片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查看加载图像的image-id。它没有标签和名字。您可以简单地更新标签和名称,如下所示。

docker tag <image_id> group_name/name:tag
# docker rm $(docker ps -aq)

之后,按照阮的建议使用命令。

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

你可以自己运行这个函数,如果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

如果你想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

只需简单地使用:

docker rmi <image:tag> -f

例如:

docker rmi ubuntu:latest -f

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

这对我很有效

正在删除映像id: b721d1cdaac7

 docker rmi b721d1cdaac7 -f

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

删除所有子映像

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

正在删除映像id: b721d1cdaac7

docker rmi b721d1cdaac7 -f

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

删除所有子映像命令。

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

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

请运行docker命令

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

然后运行

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

在工作了几个小时后,我发现上面的命令非常有用。

  1. 否则,执行prune脚本。 李https://gist.github.com/sethbergman/cb0f1f700b1f6474b9738191055c9fb7 < / >

确保你没有击中错误的限速如果后面的公司代理。

如果你碰巧安装了公司代理,并且使用Windows,你可能想尝试一下这个简单的修复方法。我在这里找到了一些有用的回答。然而,即使在运行docker image prune和其他命令之后,我也发现了之前被掩盖的可爱的错误(和根本原因):“toomanyrequests: You have reached your pull rate limit…”

修复。

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

这可能会帮你省下和IT部门的电话/罚单。;)

正如在这里所解释的,我使用以下方式来识别依赖图像并删除它们,

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