可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am trying
docker rmi c565603bc87f
Error:
Error response from daemon: conflict: unable to delete c565603bc87f
(cannot be forced) - image has dependent child images
So i can't delete image even with -f flag. How to delete image then and all of its children ?
Linux and docker version:
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
Client:
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
Server:
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
回答1:
You should try to remove unnecessary images before removing the image:
docker rmi $(sudo docker images --filter "dangling=true" -q --no-trunc)
After that:
docker rmi c565603bc87f
回答2:
find the image id and parent id for all image created after the image in question with the following:
docker inspect --format='{{.Id}} {{.Parent}}' $(docker images --filter since=<image_id> -q)
Then you call command:
docker rmi {sub_image_id}
"sub_image_id" is ID of dependent image
回答3:
In some cases (like in my case) you may be trying to delete an image by specifying the image id that has multiple tags that you don't realize exist, some of which may be used by other images. In which case, you may not want to remove the image.
If you have a case of redundant tags as described here, instead of docker rmi <image_id>
use docker rmi <repo:tag>
on the redundant tag you wish to remove.
回答4:
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
回答5:
all previous answers are correct but here is one solution which is just deleteing all of your images forcefully (use this command at your own risk it will delete all of your images)
docker rmi $(docker images -q) -f
回答6:
What worked to me was to use the REPOSITORY:TAG combination rather than IMAGE ID.
When I tried to delete a docker image with the command docker rmi <IMAGE ID>
with no containers associated with this image I had the message:
$ docker rmi 3f66bec2c6bf
Error response from daemon: conflict: unable to delete 3f66bec2c6bf (cannot be forced) - image has dependent child images
I could delete with success when I used the command docker rmi RPOSITORY:TAG
$ docker rmi ubuntu:18.04v1
Untagged: ubuntu:18.04v1
回答7:
The answer here is to find all descendent children, which has an answer here:
docker how can I get the list of dependent child images?
Then use that to remove the child images in order.
回答8:
Building on Simon Brady's brute force method here, if you don't have a ton of images you can use this shell function:
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}
}
and then call it using recursive_remove_image <image-id>
.
回答9:
THIS COMMAND REMOVES ALL IMAGES (USE WITH CAUTION)
Have you tried to use --force
sudo docker rmi $(sudo docker images -aq) --force
This above code run like a charm even doe i had the same issue
回答10:
I also got this issue, I could resolve issue with below commands. this may be cause, the image's container is running or exit so before remove image you need to remove container
docker ps -a -f status=exited : this command shows all the exited containers so then copy container Id and then run below commands to remove container
docker rm #containerId : this command remove container this may be issue that mention "image has dependent child images"
Then try to remove image with below command
docker rmi #ImageId
回答11:
I had this issue and none of the short answers here worked, even in the page mentioned by @tudor above. I thought I would share here how I got rid of the images. I came up with the idea that dependent images must be >= the size of the parent image, which helps identify it so we can remove it.
I listed the images in size order to see if I could spot any correlations:
docker images --format '{{.Size}}\t{{.Repository}}\t{{.Tag}}\t{{.ID}}' | sort -h -r | column -t
What this does, is use some special formatting from docker to position the image size column first, then run a human readable sort in reverse order. Then I restore the easy-to-read columns.
Then I looked at the <none>
containers, and matched the first one in the list with a similar size. I performed a simple docker rmi <image:tag>
on that image and all the <none>
child images went with it.
The problem image with all the child images was actually the damn myrepo/getstarted-lab
image I used when I first started playing with docker. It was because I had created a new image from the first test image which created the chain.
Hopefully that helps someone else at some point.
回答12:
When i want to remove some unused image with name "<none>"
in docker i face with the problem unable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child images
.So for solving this problem:
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
you can see that i have several Images with name javaapp:latest and different container name. So, i killed and remove all container of "javaapp:latest" container with:
sudo docker stop "containerName"
sudo docker rm "containrName"
Then
sudo docker rmi -f "imageId"
So i can remove all the images with name "<none>"
goodluck
回答13:
Suppose we have a Dockerfile
FROM ubuntu:trusty
CMD ping localhost
We build image from that without TAG or naming
docker build .
Now we have a success report "Successfully built 57ca5ce94d04"
If we see the docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 57ca5ce94d04 18 seconds ago 188MB
ubuntu trusty 8789038981bc 11 days ago 188MB
We need to first remove the
docker rmi 57ca5ce94d04
Followed by
docker rmi 8789038981bc
By that image will be removed!
A forced removal of all as suggested by someone
docker rmi $(docker images -q) -f
回答14:
Force deleting a list of images (exclure version 10, for example)
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
回答15:
you can just do this:
➜ ~ sudo docker rmi 4ed13257bb55 -f
Deleted: sha256:4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358
Deleted: sha256:4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3
Deleted: sha256:96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69
Deleted: sha256:d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded