web-dev-qa-db-fra.com

Impossible de supprimer une image avec des enfants

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

62
Roman

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
49

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

18
Nguyen Vu Quang

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.

15
bbarker

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, toutes les images seront supprimées)

docker rmi $(docker images -q) -f

 enter image description here

7
grepit

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
7
Eduardo Costa

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
7
Limited Atonement

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

4
slushy

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.

4
tudor

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

3
Dapter20

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

2
Saman Salehi
# docker rm $(docker ps -aq)

Après cela, utilisez la commande suggérée par Nguyen.

2
camino

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-labimage 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é. 

1
Chris Gillatt

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

1
Damith Asanka

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
1
vimal krishna

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
0
Uddhav Gautam

vous pouvez simplement faire ceci:

. ➜ ~ Sudo docker rmi 4ed13257bb55 -f .__ Deleted: SHA256: 4ed13257bb5512b975b316ef482592482ca54018a7728ea1fc387e873a68c358 .__ Deleted:. SHA256: 4a478ca02e8d2336595dcbed9c4ce034cd15f01229733e7d93a83fbb3a9026d3 .__ Deleted:. SHA256: 96df41d1ce6065cf75d05873fb1f9ea9fed0ca86addcfcec7722200ed3484c69 .__ Deleted:. SHA256: d95efe864c7096c38757b80fddad12819fffd68ac3cc73333ebffaa42385fded

0
0xsr3k4nth

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é

0
Nekhla karim

Développer la réponse fournie par @Nguyen - cette fonction peut être ajoutée à votre .bashrcetc et être ensuite appelée à partir de la ligne de commande pour aider à nettoyer les éventuellesimage has dependent child imageserrors ...

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
0
Android Control