我正在尝试
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版本 客户: 版本:1.11.2 API版本:1.23 转到版本:go1.5.4 Git commit:b9f10c9 建造时间:2016年6月1日星期三22:00:43 OS / Arch:linux / amd64
服务器: 版本:1.11.2 API版本:1.23 转到版本:go1.5.4 Git commit:b9f10c9 建造时间:2016年6月1日星期三22:00:43 OS / Arch:linux / amd64
答案 0 :(得分:60)
在删除图像之前,您应该尝试删除不需要的图像:
docker rmi $(sudo docker images --filter "dangling=true" -q --no-trunc)
之后:
docker rmi c565603bc87f
答案 1 :(得分:25)
在某些情况下(例如我的情况),您可能会尝试通过指定您没有意识到存在的具有多个标记的图像ID来删除图像,其中一些可能会被使用通过其他图像。在这种情况下,您可能不想删除图片。
如果您有如此处所述的冗余标记,请在要删除的冗余标记上使用docker rmi <image_id>
而不是docker rmi <repo:tag>
。
答案 2 :(得分:21)
使用以下内容查找在相关图像之后创建的所有图像的图像ID和父ID:
docker inspect --format='{{.Id}} {{.Parent}}' $(docker images --filter since=<image_id> -q)
然后你调用命令:
docker rmi {sub_image_id}
“sub_image_id”是从属图像的ID
答案 3 :(得分:13)
答案 4 :(得分:12)
对我有用的是使用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
答案 5 :(得分:11)
docker rmi <rep:tag>
例如:
REPOSITORY TAG IMAGE ID CREATED SIZE
python 3.6 60f85556d5d2 4 days ago 174MB
docker rmi python:3.6
答案 6 :(得分:8)
此命令删除了所有图像(谨慎使用)
您是否尝试过使用--force
sudo docker rmi $(sudo docker images -aq) --force
即使我遇到同样的问题,上面的代码也像魅力一样运行
答案 7 :(得分:7)
Here's a script to remove an image and all the images that depend on it.
#!/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
答案 8 :(得分:4)
答案 9 :(得分: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>
对其进行调用。
答案 10 :(得分:3)
当我想在docker中删除一些名称为"<none>"
的未使用映像时,我遇到了问题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”
所以我可以删除所有名称为"<none>"
的图像
好运
答案 11 :(得分:2)
# docker rm $(docker ps -aq)
之后,按照Nguyen的建议使用命令。
答案 12 :(得分:2)
请运行此docker命令
docker image rm -f $(docker image ls --filter dangling=true -q)
然后运行
docker image rm -f $(docker image ls -a -q)
我在工作了几个小时后发现上述命令非常有用。
答案 13 :(得分:1)
假设我们有一个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
其次是
docker rmi 8789038981bc
通过该图像将被删除!
根据某人的建议强行删除所有
docker rmi $(docker images -q) -f
答案 14 :(得分:1)
我有这个问题,这里没有简短的答案,即使在@tudor上面提到的页面中也是如此。我想我会在这里分享如何摆脱图像。我想到了依赖图像必须&gt; =父图像的大小,这有助于识别它,以便我们可以删除它。
我按照大小顺序列出了图像,看看我是否能发现任何相关性:
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。这是因为我从第一个创建链的测试图像中创建了一个新图像。
希望在某些时候帮助别人。
答案 15 :(得分:1)
我也遇到了这个问题,我可以通过以下命令解决问题。这可能是原因,图像的容器正在运行或退出,因此在删除图像之前需要删除容器
docker ps -a -f status = exited:此命令显示所有已退出的容器,然后复制容器ID,然后运行以下命令以删除容器
docker rm #containerId:此命令删除容器这可能是提及&#34;图像具有依赖子图像的问题&#34;
然后尝试使用以下命令删除图像
docker rmi #ImageId
答案 16 :(得分:1)
尝试删除图像 ID:b721d1cdaac7
docker rmi b721d1cdaac7 -f
响应:来自守护进程的错误响应:冲突:无法删除 b721d1cdaac7(不能强制)-图像具有依赖的子图像
删除所有子图片命令:
docker image rm $(docker images --filter since=b721d1cdaac7 -q) -f
它将首先取消标记并删除所有子图像
答案 17 :(得分:0)
强制删除图像列表(例如,排除版本10)
码头图片| grep版本| grep -v version10&gt; images.txt&amp;&amp;对于 img in $(awk -F“”'{print $ 3}'/ root / image.txt);做码头工人rmi -f $ img;完成
答案 18 :(得分:0)
您可以这样做:
➜〜sudo docker rmi 4ed13257bb55 -f 删除:sha256:4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 删除:sha256:4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 删除:sha256:96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 删除:sha256:d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded
答案 19 :(得分:0)
图像层:存储库通常被称为图像或容器图像,但实际上它们由一层或多层组成。存储库中的图像层以父子关系连接在一起。每个图像层代表其自身与父层之间的变化。
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
答案 20 :(得分:0)
扩展@Nguyen提供的答案-该功能可以添加到您的.bashrc
等中,然后从命令行调用以帮助清除所有 image has dependent child images
错误。 ..
您可以自己运行该函数,如果docker ps
失败,它将用docker
运行sudo
命令并提示您输入密码。
否是否删除任何正在运行的容器的图像!
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
答案 21 :(得分:0)
尝试删除图像 ID:b721d1cdaac7 码头工人 rmi b721d1cdaac7 -f 响应:来自守护进程的错误响应:冲突:无法删除 b721d1cdaac7(不能强制)-图像具有依赖的子图像
删除所有子图像 docker image rm $(docker images --filter since=b721d1cdaac7 -q) -f
答案 22 :(得分:-1)
只需简单地使用:
docker rmi <image:tag> -f
例如:
docker rmi ubuntu:latest -f
将删除带有标记名称 ubuntu
的图像名称 latest
,而 -f
用于强制删除。
它对我有用