Que sont les images Docker pendantes ?
Les images Docker pendantes sont des couches non balisées et inutilisées qui existent sur le système de fichiers de votre hôte. Vous n’êtes peut-être pas au courant de leur présence et ce sont généralement des déchets indésirables.
Dans cet article, vous apprendrez comment les images pendantes apparaissent et ce que vous pouvez faire pour les nettoyer. C’est une bonne idée d’inspecter périodiquement le nombre d’images pendantes que vous avez afin d’éviter de gaspiller la capacité de votre disque.
Sommaire
Qu’est-ce qu’une image pendante ?
Une image pendante est simplement une image inutilisée qui n’a ni nom ni tag. Vous pouvez facilement repérer les images pendantes lorsque vous exécutez le docker images
commande parce qu’ils apparaissent comme <none>:<none>
.
Dans cet exemple, la première image de la liste est une image pendante :
$ docker images <none> <none> 509bc96b727d 2 months ago 55.3MB mysql 5.7 f26e21ddd20d 4 months ago 450MB gcr.io/k8s-minikube/kicbase v0.0.30 1312ccd2422d 6 months ago 1.14GB hello-world latest feb5d9fea6a5 11 months ago 13.3kB
L’image n’est pas taguée mais persiste toujours sur votre système. Dans ce cas, 55,3 Mo d’espace disque sont consommés.
Vous pouvez vérifier que l’image est suspendue et pas simplement inutilisée en vérifiant si un conteneur y fait référence :
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS 2aa683500ee0 gcr.io/k8s-minikube/kicbase:v0.0.30 "/usr/local/bin/entr..." 18 hours ago Exited (130) 18 hours ago
Aucun conteneur ne fait référence au <none>:<none>
image avec identifiant 509bc96b727d
donc c’est définitivement suspendu. Notez que les images MySQL et Hello World ne le faites pas classe comme suspendus – bien qu’ils ne soient pas utilisés par les conteneurs, ils sont correctement étiquetés, il est donc supposé que vous voudrez les conserver.
Comment les images pendantes sont-elles créées ?
Les images pendantes sont généralement créées lorsqu’une image existante est remplacée par une nouvelle version. Voici un simple Dockerfile pour montrer ce qui se passe :
FROM alpine:latest COPY demo.txt /demo.txt
Créer un fichier nommé demo.txt
dans votre répertoire de travail et ajoutez-y du contenu :
$ echo 1 > demo.txt
Construisez maintenant votre image avec docker build
:
$ docker build -t demo:latest .
Exécutez le docker images
commande pour voir votre nouvelle image :
REPOSITORY TAG IMAGE ID CREATED SIZE demo latest 40395b6c1362 24 seconds ago 5.54MB
Modifiez maintenant le contenu de demo.txt
et reconstruisez votre image :
$ echo 2 > demo.txt $ docker build -t demo:latest .
La même balise d’image est utilisée – demo:latest
– donc cette version remplace la première. Courir docker images
pour voir l’effet :
REPOSITORY TAG IMAGE ID CREATED SIZE demo latest 3d5052e52b4c 3 seconds ago 5.54MB <none> <none> 40395b6c1362 59 seconds ago 5.54MB
La nouvelle image a été créée avec ID 3d5052e52b4c
et le demo:latest
étiquette. La première image, ID 40395b6c1362
, existe toujours mais n’a pas été balisé. Il apparaît maintenant comme <none>:<none>
. Cette image est devenue une image pendante car aucun conteneur ne l’utilise.
Pouvez-vous utiliser une image pendante ?
Les images pendantes fonctionnent comme n’importe quelle autre image. La seule différence est la balise manquante. Vous pouvez démarrer un conteneur à partir d’une image pendante en faisant directement référence à l’ID de l’image :
$ docker run -it 40395b6c1362 sh / #
Techniquement, l’image n’est plus en suspens, car elle est désormais activement utilisée par un conteneur. Il est courant que les conteneurs se retrouvent avec un none
image si vous supprimez ou reconstruisez la balise qu’ils ont utilisée. Les conteneurs avec une image non taguée afficheront l’ID de l’image dans le IMAGE
colonne lorsque vous exécutez docker ps
au lieu de la balise habituelle.
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 26d5609ba75c 40395b6c1362 "sh" 2 seconds ago Up 1 second inspiring_lederberg 91ab866b59a2 portainer/portainer-ce "/portainer" 2 weeks ago Up 2 days 8000/tcp, 9443/tcp portainer_portainer_1
Nettoyer les images pendantes
Vous pouvez supprimer une seule image pendante à l’aide de la docker rmi
commande, comme n’importe quelle autre image. Étant donné que l’image ne sera pas taguée, vous devrez l’identifier par son ID.
$ docker rmi 40395b6c1362
Une meilleure façon de nettoyer de nombreuses images pendantes est la docker image prune
commande. Cela supprimera automatiquement toutes les images pendantes sur votre hôte Docker.
$ docker image prune Total reclaimed space: 5.54 MB
La sortie de la commande indique la quantité d’espace disque qui a été libérée. Vérifiez si vos images sont réellement suspendues si rien n’est supprimé. Il n’est pas possible de supprimer les images activement utilisées par les conteneurs. Vous devrez supprimer les conteneurs avec docker rm
d’abord, avant d’essayer d’élaguer vos images.
Vous pourriez découvrir que vous avez une image pendante que vous souhaitez réellement réutiliser à l’avenir. Dans cette situation, vous pouvez le ré-étiqueter avec le docker tag
commande. Cela facilitera l’identification de l’image et évitera qu’elle ne soit ciblée par de futures opérations d’élagage.
$ docker tag 40395b6c1362 demo:latest
Images qui s’affichent comme <none>:<none>
peut-être pas des images pendantes. De manière confuse, cette situation se produit également pour les images créées en tant que couches intermédiaires lors d’une génération.
Chaque étape d’un Dockerfile entraîne la création d’une nouvelle couche intermédiaire. L’image produite à la fin de la construction se voit attribuer la balise que vous spécifiez. Les autres couches intermédiaires restent non étiquetées et peuvent être visualisées en exécutant docker images -a
.
Ces calques ne sont pas des images pendantes car les images ultérieures de la chaîne de construction en dépendent. Ils sont référencés par chaque couche successive et ne causent pas de problème d’espace disque. Vous pouvez arrêter la persistance des couches intermédiaires sur le disque en incluant le --rm
drapeau au moment de la construction :
$ docker build --rm -t demo:latest .
Sommaire
Les images pendantes sont des images Docker non balisées qui ne sont pas utilisées par un conteneur ou dont un descendant ne dépend pas. Ils ne servent généralement à rien mais consomment toujours de l’espace disque. Vous accumulerez des images pendantes lorsque vous remplacerez une balise existante en démarrant une nouvelle génération.
Toutes les images pendantes s’affichent comme <none>:<none>
dans l’interface de ligne de commande Docker. En avoir trop peut être écrasant lorsque vous avez des dizaines d’images sans aucune information sur leur véritable identité. Courir régulièrement docker images prune
évitera le gaspillage d’espace disque et réduira la liste des images.