Qu'est-ce qu'une image suspendue et qu'est-ce qu'une image inutilisée?

157

Dans la documentation de docker de l'image de docker prune, il est possible d'utiliser l'indicateur -a pour

Supprimez toutes les images inutilisées, pas seulement celles qui pendent

et ensuite

Supprimez toutes les images pendantes. Si -a est spécifié, supprimera également toutes les images non référencées par aucun conteneur.

Quelqu'un peut-il m'expliquer ce que sont les images pendantes et quelle est la différence entre les images pendantes et inutilisées?

herm
la source
docker image prune (sans -a) fait exactement la même chose
herm
Cela échoue lorsque vous l'utilisez dans jenkins, nous perdrons la sauvegarde du docker en production si nous dépendons du cache d'image docker. prunen'est pas recommandé en production /
Jinna Balu

Réponses:

156

Une image inutilisée signifie qu'elle n'a pas été affectée ou utilisée dans un conteneur. Par exemple, lors de l'exécution docker ps -a, il répertorie tous vos conteneurs sortis et en cours d'exécution. Toutes les images montrées utilisées dans l'un des conteneurs sont une "image utilisée".

D'un autre côté, une image suspendue signifie simplement que vous avez créé la nouvelle construction de l'image, mais qu'elle n'a pas reçu de nouveau nom. Ainsi, les anciennes images que vous avez deviennent «l'image pendante». Ces anciennes images sont celles qui ne sont pas marquées et qui affichent " <none>" sur son nom lorsque vous exécutez docker images.

Lors de l'exécution docker system prune -a, il supprimera à la fois les images inutilisées et pendantes. Par conséquent, toutes les images utilisées dans un conteneur, qu'elles aient été fermées ou en cours d'exécution, ne seront PAS affectées.

Serey
la source
Selon la documentation lors de l'exécution de docker prune sans -a, seules les images pendantes sont supprimées. -a s'assurera que les images inutilisées sont également supprimées, non? docs.docker.com/engine/reference/commandline/system_prune
herm
1
Très intéressant. Ainsi, une image suspendue peut être utilisée par un conteneur. Remarque: Docker vous avertit s'il existe des conteneurs utilisant ces images non marquées.
herm
7
docker system prune --all --filter "until=24h"préserve aussi les images récentes
Harry Moreno
1
Selon docs.docker.com/engine/reference/commandline/system_prune/… docker system prune -a supprime également les conteneurs arrêtés. Donc, il devrait également supprimer les images associées uniquement aux conteneurs sortis, non?
lfk
41

Le moyen le plus sûr et le plus simple de nettoyer les images pendantes

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

Les images Docker se composent de plusieurs couches. Les images pendantes sont des calques qui n'ont aucun rapport avec les images marquées. Ils ne servent plus un but et consomment de l'espace disque.

Remarque: je recommande de ne pas utiliser pruneen production, car docker system prune -asupprimera toutes les images qui ne sont pas référencées par le conteneur, par lesquelles nous ne pouvons pas revenir à la version précédente.

Pour répertorier les images pendantes en ajoutant l'indicateur de filtre, -favec une valeur de dangling=trueà docker images.

Liste des images pendantes

docker images -f dangling=true

Supprimer les images pendantes

docker rmi $(docker images -f dangling=true -q)

OU

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

Lorsque nous exécutons des tâches cron pour supprimer les éléments en suspens, utilisez ce qui précède pour vous assurer que la tâche s'exécute correctement. Comme dans Jenkins, si nous exécutons un travail de style libre avec la commande ci-dessous, le travail de la commande n'échouera jamais même s'il n'y a pas de choses en suspens dans la machine.

C'est le moyen le plus sûr et le plus simple de nettoyer les images pendantes et de récupérer notre espace disque pour l'utiliser.

Jinna Balu
la source
2
qu'en est-il de la taille d'image de docker? Les documents disent: "Supprimez toutes les images pendantes. Si -a est spécifié, supprimera également toutes les images qui ne sont référencées par aucun conteneur." docs.docker.com/engine/reference/commandline/image_prune/…
herm
2
@herm, depuis le bas de la page que vous avez référencée "Remarque: vous êtes invité à confirmer avant que le pruneau ne supprime quoi que ce soit, mais vous ne voyez pas la liste de ce qui sera potentiellement supprimé". Je pense que le point dans cette réponse est que vous pouvez obtenir une liste des images pendantes, que vous spécifiez ensuite explicitement pour être supprimées, par opposition à la suppression aveugle de toutes les images pendantes avec pruneau.
bzier
Les images dont le nom et l'étiquette docker imagessont absents sont suspendues. Comment vérifier leur taille? De plus, les images dont le nom et l'étiquette docker images -asont absents sont des images intermédiaires. Peuvent-ils être supprimés et comment vérifier leur taille?
variable
17

Les images dans le menu fixe sont référencées par un condensé sha256, souvent appelé identifiant d'image. Ce résumé est tout ce dont vous avez besoin pour que l'image existe sur l'hôte docker. En règle générale, vous aurez des balises qui pointent vers ces résumés, par exemple la balise busybox: le dernier point actuel vers l'image id c30178c523 ... sur mon système. Plusieurs balises peuvent pointer vers la même image, et toute balise peut être modifiée pour pointer vers un identifiant différent, par exemple lorsque vous tirez une nouvelle copie de busybox: latest ou créez une nouvelle version de l'image de votre application.

Les images pendantes sont des images qui n'ont pas de balise, et qui n'ont pas d'image enfant (par exemple une ancienne image qui utilisait une version différente de FROM busybox:latest), pointant vers elles. Ils peuvent avoir eu une balise pointant vers eux avant et cette balise a changé plus tard. Ou ils peuvent n'avoir jamais eu de balise (par exemple, la sortie d'un docker buildsans inclure l'option de balise). Ils peuvent généralement être supprimés en toute sécurité tant qu'aucun conteneur n'est toujours en cours d'exécution qui référence l'ancien identifiant d'image. La principale raison de les conserver est à des fins de mise en cache de construction.

De plus, vous avez peut-être téléchargé des images qui ne vous sont pas actuellement utilisées par les conteneurs (y compris les conteneurs arrêtés). Celles-ci sont totalement différentes des images pendantes et peuvent être supprimées en toute sécurité tant que vous ne prévoyez pas de les utiliser à l'avenir ou que cela ne vous dérange pas de télécharger une autre copie lorsque vous en avez besoin.

BMitch
la source
Pendant qu'une construction de docker est en cours d'exécution (le processus dans lequel elle crée des couches et des candidats possibles pour de futures images pendantes), dans une nouvelle fenêtre, si j'exécute le prune d'image de docker, cela affectera-t-il la construction en cours de quelque manière que ce soit?
variable
@variable, il pourrait y avoir une condition de concurrence, mais généralement le conteneur en cours d'exécution pour une étape de construction entraînera l'identification de l'image comme étant en cours d'utilisation. Le pire qui puisse arriver est soit le pruneau génère une erreur, soit la construction le fait, et vous devrez le réexécuter. Je vérifierais si vous pouvez limiter votre taille pour éviter les images que vous utilisez actuellement pour créer, car une taille réussie entraînera la nécessité pour les futures versions de télécharger à nouveau des images.
BMitch
Les images intermédiaires (celles qui n'ont aucun nom / tag affiché lors de l'exécution docker images -a) sont-elles également appelées images suspendues? Est-ce qu'ils sont effacés avec la taille d'image Docker?
variable
Je ne les ai plus dans mon environnement (en utilisant buildkit ici), je vous recommande donc de vous essayer dans un environnement de laboratoire pour voir ce qui se passe.
BMitch
Cela dit, supprimer les "images" non balisées des étapes intermédiaires est assez inutile, sauf si vous supprimez l'image balisée finale, tous les calques sont réutilisés dans une image ultérieure et ne peuvent pas être supprimés. Si vous les supprimez, vous détruisez votre cache de build et obligez toutes les futures images à prendre plus de temps à construire et à stocker de l'espace disque.
BMitch
5

Les images pendantes sont des calques qui n'ont aucune relation avec les images balisées. Ils ne servent plus un but et consomment de l'espace disque.

Une image inutilisée est une image qui n'a pas été attribuée ou utilisée dans un conteneur.

Liste des images pendantes

docker images -f dangling=true
subh2273
la source
3

les images pendantes sont des images non marquées. La commande suivante donne la liste des images pendantes.

docker images --filter "dangling=true"

docker image prune supprime toutes les images pendantes.

Les images inutilisées sont des images qui ont des balises mais qui ne sont actuellement pas utilisées comme conteneur. Vous pouvez ou non en avoir besoin à l'avenir.

docker image prune -a supprimer toutes les images pendantes et inutilisées.

Vous ne souhaitez généralement pas supprimer toutes les images inutilisées avant un certain temps. Par conséquent, il est préférable de supprimer avec un filtre.

docker image prune -f --filter "until=6h"

Venkat Kotra
la source
1) docker image prune -a -f --filter "until=6h"Supprime- t-il également les images pendantes?
variable
2) Dans votre dernière commande, vous mentionnez docker image prune -f --filter "until=6h"- puisqu'il n'y a pas de -a - alors comment se fait-il qu'il supprime les images inutilisées?
variable
0

J'ai vu des commandes utiles (alias) pour supprimer les images pendantes, gracieuseté de andyneff ici: https://forums.docker.com/t/how-to-delete-cache/5753 :

alias docker_clean_images='docker rmi $(docker images -a --filter=dangling=true -q)' 
alias docker_clean_ps='docker rm $(docker ps --filter=status=exited --filter=status=created -q)' 

Le premier nettoie toutes les images pendantes. Ceci est utile pour supprimer les images intermédiaires laissées par plusieurs builds. Le second est pour retirer les conteneurs arrêtés. Ce sont des alias que j'utilise pour la maintenance de routine

Si vous souhaitez supprimer TOUT votre cache, vous devez d'abord vous assurer que tous les conteneurs sont arrêtés et supprimés, car vous ne pouvez pas supprimer une image utilisée par un conteneur. Donc quelque chose de similaire

docker kill $(docker ps -q) docker_clean_ps docker rmi $(docker images
-a -q)

Cela tuerait et supprimerait toutes les images de votre cache.

Alexei Martianov
la source
0

Dans la capture d'écran des images, les noms «aucun» sont des images pendantes. Une image suspendue signifie simplement que vous avez créé la nouvelle version de l'image, mais qu'elle n'a pas reçu de nouveau nom. Ainsi, les anciennes images que vous avez deviennent «l'image pendante». Ces anciennes images sont celles qui ne sont pas marquées et qui affichent "" sur son nom lorsque vous exécutez des images docker.

docker system prune -a, il supprimera à la fois les images inutilisées et pendantes. Par conséquent, toutes les images utilisées dans un conteneur, qu'elles aient été fermées ou en cours d'exécution, ne seront PAS affectées.

Nirbhay Singh
la source