J'essaie
docker rmi c565603bc87f
Erreur:
Réponse d'erreur du démon: conflit: impossible de supprimer c565603bc87f (ne peut pas être forcé) - l'image a des images enfants dépendantes
Donc, je ne peux pas supprimer l'image même avec -f flag. Comment supprimer image alors et tous ses enfants?
Version Linux et docker:
uname -a Linux goracio-pc 4.4.0-24-generic # 43-Ubuntu SMP Mer 8 Juin 19:27:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
docker version Client: Version: 1.11.2 Version de l'API: 1.23 Go version: go1.5.4 Git commit: b9f10c9 Version: mer. 1 juin 22:00: 43 2016 OS/Arch: linux/AMD64
Serveur: Version: 1.11.2 Version de l'API: 1.23 Allez version: go1.5.4 Git commit: b9f10c9 Construit: mer. Juin 1 22:00:43 2016 OS/Arch: linux/AMD64
Vous devriez essayer de supprimer les images inutiles avant de supprimer l'image:
docker rmi $(Sudo docker images --filter "dangling=true" -q --no-trunc)
Après ça:
docker rmi c565603bc87f
recherchez l'ID image et l'ID parent pour toutes les images créées après l'image en question avec les éléments suivants:
docker inspect --format='{{.Id}} {{.Parent}}' $(docker images --filter since=<image_id> -q)
Ensuite, vous appelez la commande:
docker rmi {sub_image_id}
"sub_image_id" est l'ID de l'image dépendante
Dans certains cas (comme dans mon cas), vous essayez peut-être de supprimer une image en spécifiant l'id de l'image comportant plusieurs balises dont vous ignorez l'existence, certaines pouvant être utilisées par d'autres images. Dans ce cas, vous souhaiterez peut-être ne pas supprimer l'image.
Si vous avez un cas de balises redondantes comme décrit ici, au lieu de docker rmi <image_id>
, utilisez docker rmi <repo:tag>
sur la balise redondante que vous souhaitez supprimer.
Ce qui a fonctionné pour moi a été d’utiliser la combinaison REPOSITORY: TAG plutôt que IMAGE ID.
Lorsque j'ai essayé de supprimer une image de menu fixe à l'aide de la commande docker rmi <IMAGE ID>
sans conteneur associé à cette image, le message suivant s'affiche:
$ docker rmi 3f66bec2c6bf
Error response from daemon: conflict: unable to delete 3f66bec2c6bf (cannot be forced) - image has dependent child images
Je pouvais supprimer avec succès en utilisant la commande docker rmi RPOSITORY:TAG
$ docker rmi ubuntu:18.04v1
Untagged: ubuntu:18.04v1
Voici un script pour supprimer une image et toutes les images qui en dépendent.
#!/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
En utilisant la méthode de la force brute de Simon Brady ici , si vous n'avez pas une tonne d’images, vous pouvez utiliser cette fonction 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}
}
puis appelez-le avec recursive_remove_image <image-id>
.
La réponse ici est de trouver tous les enfants descendants, ce qui a une réponse ici:
docker, comment puis-je obtenir la liste des images d'enfants dépendants?
Ensuite, utilisez-le pour supprimer les images enfants dans l'ordre.
CETTE COMMANDE SUPPRIME TOUTES LES IMAGES (UTILISER AVEC ATTENTION)
Avez-vous essayé d'utiliser --force
Sudo docker rmi $(Sudo docker images -aq) --force
Ce code ci-dessus a fonctionné comme un charme même si j'avais le même problème
Lorsque je veux supprimer une image inutilisée portant le nom "<none>"
dans le menu fixe, je suis confrontée au problème unable to delete a354bbc7c9b7 (cannot be forced) - image has dependent child images
.So pour résoudre ce problème:
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
vous pouvez voir que j’ai plusieurs images avec le nom javaapp: le nom du conteneur le plus récent et différent. Donc, j'ai tué et enlevé tout conteneur de "javaapp: latest" conteneur avec:
Sudo docker stop "containerName"
Sudo docker rm "ContainrName"
Ensuite
Sudo docker rmi -f "imageId"
Je peux donc supprimer toutes les images avec le nom "<none>"
bonne chance
# docker rm $(docker ps -aq)
Après cela, utilisez la commande suggérée par Nguyen.
J'ai eu ce problème et aucune des réponses courtes ici n'a fonctionné, même dans la page mentionnée par @tudor ci-dessus. Je pensais partager ici comment je me suis débarrassé des images. Je suis venu avec l'idée que les images dépendantes doivent être> = la taille de l'image parente, ce qui facilite son identification afin que nous puissions la supprimer.
J'ai listé les images par ordre de taille pour voir si je pouvais repérer des corrélations:
docker images --format '{{.Size}}\t{{.Repository}}\t{{.Tag}}\t{{.ID}}' | sort -h -r | column -t
Cela permet d'utiliser un formatage spécial à partir du menu fixe pour positionner d'abord la colonne de taille d'image, puis d'exécuter un tri lisible par l'homme dans l'ordre inverse. Ensuite, je restaure les colonnes faciles à lire.
Ensuite, j’ai examiné les conteneurs <none>
et j’ai comparé le premier de la liste avec une taille similaire. J'ai effectué un docker rmi <image:tag>
simple sur cette image et toutes les images enfants <none>
l'ont été.
L'image problème avec toutes les images enfants était en fait le maudit myrepo/getstarted-lab
image que j'ai utilisée lorsque j'ai commencé à jouer avec docker. C'est parce que j'avais créé une nouvelle image à partir de la première image de test qui a créé la chaîne.
J'espère que cela aidera quelqu'un d'autre à un moment donné.
J'ai aussi eu ce problème, je pourrais résoudre le problème avec les commandes ci-dessous. cela peut être la cause, le conteneur de l'image est en cours d'exécution ou quitte donc avant de supprimer l'image, vous devez supprimer le conteneur
docker ps -a -f status = exited: cette commande affiche tous les conteneurs sortis, alors copiez le conteneur ID puis exécutez les commandes ci-dessous pour supprimer le conteneur
docker rm #containerId: cette commande remove container c'est peut-être la mention "l'image a des images enfants dépendantes"
Ensuite, essayez de supprimer l'image avec la commande ci-dessous
docker rmi #ImageId
Supposons que nous ayons un fichier Docker
FROM ubuntu:trusty
CMD ping localhost
Nous construisons l'image à partir de cela sans TAG ni nommage
docker build .
Maintenant, nous avons un rapport de réussite "57ca5ce94d04 construit" Si nous voyons les images de docker
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 57ca5ce94d04 18 seconds ago 188MB
ubuntu trusty 8789038981bc 11 days ago 188MB
Nous devons d'abord supprimer le docker rmi 57ca5ce94d04
Suivi par
docker rmi 8789038981bc
Par cette image sera supprimé!
Un enlèvement forcé de tous comme suggéré par quelqu'un
docker rmi $(docker images -q) -f
Couche d'image: Les référentiels sont souvent appelés images ou images de conteneur, mais en réalité, ils sont constitués d'une ou de plusieurs couches. Les couches d'image d'un référentiel sont liées entre elles dans une relation parent-enfant. Chaque couche d'image représente les modifications entre elle et la couche parent.
Le modèle de construction de docker utilise héritage . Cela signifie que la version i
dépend de la version i-1
. Nous devons donc supprimer la version i+1
pour pouvoir supprimer la version i
. C'est une dépendance simple.
Si vous souhaitez supprimer toutes les images, à l'exception de la dernière (la plus mise à jour) et de la première (base), vous pouvez exporter la dernière (la plus mise à jour) à l'aide de la commande docker save
ci-dessous.
docker save -o <output_file> <your_image-id> | gzip <output_file>.tgz
Ensuite, supprimez toutes les images à l’aide de image-id comme ci-dessous.
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
Maintenant, chargez votre image tgz sauvegardée comme ci-dessous.
gzip -c <output_file.tgz> | docker load
voyez l'image-id de votre image chargée en utilisant le menu fixe ps -q. Il n'a pas de tag et de nom. Vous pouvez simplement mettre à jour la balise et le nom comme indiqué ci-dessous.
docker tag <image_id> group_name/name:tag
vous pouvez simplement faire ceci:
. ➜ ~ Sudo docker rmi 4ed13257bb55 -f .__ Deleted: SHA256: 4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 .__ Deleted:. SHA256: 4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 .__ Deleted:. SHA256: 96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 .__ Deleted:. SHA256: d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded
Forcer la suppression d'une liste d'images (exclure la version 10, par exemple)
images de docker | version de grep | grep -v version10> images.txt && pour img in $ (awk -F "" '{print $ 3}' '/root/images.txt); faire docker rmi -f $ img; terminé
Développer la réponse fournie par @Nguyen - cette fonction peut être ajoutée à votre .bashrc
etc et être ensuite appelée à partir de la ligne de commande pour aider à nettoyer les éventuellesimage has dependent child images
errors ...
Vous pouvez exécuter la fonction vous-même, et si un docker ps
échoue, la commande docker
sera exécutée avec Sudo
et vous demandera votre mot de passe.
Est-ce quePASsupprime les images des conteneurs en cours d'exécution!
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}')
}
J'ai aussi cela dans mon fichier .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
}
Marche avec:
$ docker --version
Docker version 17.05.0-ce, build 89658be