283 votes

Impossible de supprimer une image avec des enfants

Je suis en train

docker rmi c565603bc87f

Erreur:

Réponse d'erreur de démon: conflit: impossible de supprimer c565603bc87f (ne peut pas être forcé) - image a un enfant à charge les images

Donc je ne peux pas supprimer l'image, même avec l'option-f. Comment faire pour supprimer l'image puis et tous ses enfants ?

Linux et 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 La version de l'API: 1.23 Go version: go1.5.4 Git commit: b9f10c9 Construit: Wed Jun 1 22:00:43 2016 OS/Arch: linux/amd64

Serveur: Version: 1.11.2 La version de l'API: 1.23 Go version: go1.5.4 Git commit: b9f10c9 Construit: Wed Jun 1 22:00:43 2016 OS/Arch: linux/amd64

211voto

bbarker Points 187

Dans certains cas (comme dans mon cas), vous essayez peut-être de supprimer une image en spécifiant un identifiant d'image comportant plusieurs balises dont vous ne vous rendez pas compte, certaines pouvant être utilisées par d'autres images. Dans ce cas, vous ne voulez pas supprimer l'image .

Si vous avez un cas de tags redondants comme décrit ici, au lieu de docker rmi <image_id> utilisez docker rmi <repo:tag> sur le tag redondant que vous souhaitez supprimer.

184voto

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
 

92voto

CPU 100 Points 2269

toutes les réponses précédentes sont correctes, mais voici une solution qui consiste à supprimer toutes vos images avec force ( utilisez cette commande à vos risques et périls, elle supprimera toutes vos images ).

 docker rmi $(docker images -q) -f
 

entrez la description de l'image ici

75voto

Nguyen Vu Quang Points 161

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

9voto

Limited Atonement Points 1446

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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X