Was ist ein baumelndes Bild und was ist ein unbenutztes Bild?


154

In der Docker- Dokumentation von Docker Image Prune ist es möglich, das Flag -a to zu verwenden

Entfernen Sie alle nicht verwendeten Bilder, nicht nur baumelnde

und später

Entfernen Sie alle baumelnden Bilder. Wenn -a angegeben ist, werden auch alle Bilder entfernt, auf die von keinem Container verwiesen wird.

Kann mir jemand erklären, was baumelnde Bilder sind und was der Unterschied zwischen baumelnden und nicht verwendeten Bildern ist?


Docker Image Prune (ohne -a) macht genau das gleiche
Herm

Wenn Sie dies in Jenkins verwenden, schlägt die Docker-Sicherung in der Produktion verloren, wenn wir vom Docker-Image-Cache abhängig sind. prunewird in der Produktion nicht empfohlen /
Jinna Balu

Antworten:


153

Ein nicht verwendetes Bild bedeutet, dass es nicht zugewiesen oder in einem Container verwendet wurde. Wenn Sie beispielsweise ausgeführt werden, docker ps -awerden alle Ihre verlassenen und aktuell ausgeführten Container aufgelistet. Alle Bilder, die in einem der Container verwendet werden, sind "gebrauchte Bilder".

Auf der anderen Seite bedeutet ein baumelndes Bild nur, dass Sie den neuen Build des Bildes erstellt haben, aber es wurde kein neuer Name vergeben. So werden die alten Bilder, die Sie haben, zum "baumelnden Bild". Diese alten Bilder sind diejenigen, die nicht markiert sind und <none>beim Ausführen " " auf ihrem Namen anzeigen docker images.

Beim Ausführen docker system prune -awerden sowohl nicht verwendete als auch baumelnde Bilder entfernt. Daher sind Bilder, die in einem Container verwendet werden, unabhängig davon, ob sie beendet wurden oder gerade ausgeführt werden, NICHT betroffen.


Laut Dokumentation werden beim Ausführen von Docker Prune ohne -a nur baumelnde Bilder entfernt. -a wird sicherstellen, dass nicht verwendete Bilder auch gelöscht werden, oder? docs.docker.com/engine/reference/commandline/system_prune
Herm


1
Sehr interessant. So kann ein baumelndes Bild von einem Container verwendet werden. Hinweis: Docker warnt Sie, wenn Container vorhanden sind, die diese Bilder ohne Tags verwenden.
Herm

7
docker system prune --all --filter "until=24h"bewahrt auch aktuelle Bilder
Harry Moreno

1
Laut docs.docker.com/engine/reference/commandline/system_prune/… werden auch docker system prune -a gestoppte Container entfernt. Es sollten also auch Bilder entfernt werden, die nur mit verlassenen Containern verknüpft sind, oder?
lfk

41

Sicherster und einfachster Weg, um baumelnde Bilder zu bereinigen

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

Docker-Bilder bestehen aus mehreren Ebenen. Baumelnde Bilder sind Ebenen, die keine Beziehung zu markierten Bildern haben. Sie erfüllen keinen Zweck mehr und belegen Speicherplatz.

Hinweis: Ich empfehle, nicht prunein der Produktion zu verwenden, da docker system prune -aalle Bilder entfernt werden, auf die der Container nicht verweist, sodass wir nicht auf die vorherige Version zurücksetzen können.

Zum Auflisten baumelnder Bilder durch Hinzufügen des Filter-Flags -fmit dem Wert dangling=trueto docker images.

Liste baumelnde Bilder

docker images -f dangling=true

Entfernen Sie baumelnde Bilder

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

ODER

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

Wenn wir Cron-Jobs ausführen, um das baumelnde Material zu löschen, verwenden Sie die oben genannten Schritte, um sicherzustellen, dass der Job erfolgreich ausgeführt wird. Wie in Jenkins, wenn wir einen Free-Style-Job mit dem folgenden Commad-Job ausführen, wird dies niemals scheitern, selbst wenn kein baumelndes Zeug in der Maschine vorhanden ist.

Dies ist der sicherste und einfachste Weg, um baumelnde Bilder zu bereinigen und unseren Speicherplatz zur Verwendung zurückzugewinnen.


2
Was ist mit Docker Image Prune? Die Dokumente sagen: "Alle baumelnden Bilder entfernen. Wenn -a angegeben ist, werden auch alle Bilder entfernt, auf die von keinem Container verwiesen wird." docs.docker.com/engine/reference/commandline/image_prune/...
Herm

2
@herm, am Ende der Seite, auf die Sie verwiesen haben "Hinweis: Sie werden zur Bestätigung aufgefordert, bevor die Bereinigung etwas entfernt, aber es wird keine Liste der möglicherweise entfernten Elemente angezeigt." Ich denke, der Punkt in dieser Antwort ist, dass Sie eine Liste der baumelnden Bilder erhalten können, die Sie dann explizit angeben, um entfernt zu werden, anstatt alle baumelnden Bilder blind mit Prune zu entfernen.
Bzier

Die Bilder mit Namen und Tag als keine in docker imagesbaumeln. Wie überprüfe ich ihre Größe? Außerdem sind die Bilder mit dem Namen und dem Tag "Keine" docker images -aZwischenbilder. Können sie gelöscht werden und wie kann man ihre Größe überprüfen?
Variable

17

Bilder im Docker werden von einem sha256-Digest referenziert, der häufig als Bild-ID bezeichnet wird. Dieser Digest ist alles, was Sie benötigen, damit das Image auf dem Docker-Host vorhanden ist. In der Regel haben Sie Tags, die auf diese Digests verweisen, z. B. das Tag Busybox: Die neuesten aktuellen Punkte für die Image-ID c30178c523 ... auf meinem System. Mehrere Tags können auf dasselbe Image verweisen, und jedes Tag kann so geändert werden, dass es auf eine andere ID verweist, z. B. wenn Sie eine neue Kopie von Busybox: Recent abrufen oder eine neue Version Ihres Anwendungsimages erstellen.

Dangling-Bilder sind Bilder, die kein Tag und kein untergeordnetes Bild haben (z. B. ein altes Bild, das eine andere Version von verwendet hat FROM busybox:latest ) und auf sie zeigen. Möglicherweise hatte sie zuvor ein Tag, das auf sie zeigte, und dieses Tag wurde später geändert. Oder sie hatten möglicherweise noch nie ein Tag (z. B. die Ausgabe von a docker buildohne die Tag-Option). Diese können normalerweise sicher entfernt werden, solange noch keine Container ausgeführt werden, die auf die alte Image-ID verweisen. Der Hauptgrund, sie zu behalten, ist das Erstellen von Caching-Zwecken.

Darüber hinaus haben Sie möglicherweise Bilder heruntergeladen, die derzeit nicht von Containern verwendet werden (einschließlich gestoppter Container). Diese Bilder unterscheiden sich grundlegend von baumelnden Bildern und können sicher entfernt werden, solange Sie nicht vorhaben, sie in Zukunft zu verwenden, oder wenn Sie eine weitere Kopie herunterladen möchten, wenn Sie sie benötigen.


Während ein Docker-Build ausgeführt wird (der Prozess, in dem Ebenen und mögliche Kandidaten für zukünftige baumelnde Bilder erstellt werden), hat dies in einem neuen Fenster, wenn ich Docker-Image-Bereinigung ausführe, Auswirkungen auf den laufenden Build?
Variable

@variable Es kann eine Race-Bedingung enthalten sein, aber normalerweise führt der laufende Container für einen Build-Schritt dazu, dass das Image als verwendet identifiziert wird. Das Schlimmste, was passieren kann, ist, dass entweder die Bereinigung einen Fehler auslöst oder der Build dies tut, und Sie müssten ihn erneut ausführen. Ich würde prüfen, ob Sie Ihre Bereinigung einschränken können, um Bilder zu vermeiden, die Sie derzeit zum Erstellen verwenden, da eine erfolgreiche Bereinigung dazu führt, dass zukünftige Builds erneut Bilder herunterladen müssen.
BMitch

Werden Zwischenbilder (solche, bei denen beim Ausführen kein Name / Tag angezeigt wird docker images -a) auch als baumelnde Bilder bezeichnet? Werden sie mit Docker Image Prune gelöscht?
variabel

Ich habe diese nicht mehr in meiner Umgebung (hier mit Buildkit), daher würde ich empfehlen, sich in einer Laborumgebung zu versuchen, um zu sehen, was passiert.
BMitch

Das Löschen der nicht getaggten "Bilder" aus den Zwischenstufen ist jedoch ziemlich sinnlos. Wenn Sie nicht das endgültige getaggte Bild löschen, werden alle Ebenen in einem späteren Bild wiederverwendet und können nicht gelöscht werden. Wenn Sie sie löschen, zerstören Sie Ihren Build-Cache und verursachen, dass alle zukünftigen Images mehr Zeit zum Erstellen und Speicherplatz zum Speichern benötigen.
BMitch

5

Dangling-Bilder sind Ebenen, die keine Beziehung zu markierten Bildern haben. Sie erfüllen keinen Zweck mehr und belegen Speicherplatz.

Ein nicht verwendetes Bild ist ein Bild, das nicht in einem Container zugewiesen oder verwendet wurde.

Liste baumelnde Bilder

docker images -f dangling=true

3

baumelnde Bilder sind Bilder ohne Tags. Der folgende Befehl gibt eine Liste der baumelnden Bilder an.

docker images --filter "dangling=true"

docker image prune löscht alle baumelnden Bilder.

Nicht verwendete Bilder sind Bilder mit Tags, die derzeit jedoch nicht als Container verwendet werden. Möglicherweise benötigen Sie es in Zukunft oder nicht.

docker image prune -a Löschen Sie alle baumelnden sowie nicht verwendeten Bilder.

Im Allgemeinen möchten Sie erst nach einiger Zeit alle nicht verwendeten Bilder entfernen. Daher ist es besser, mit einem Filter zu entfernen.

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


1) docker image prune -a -f --filter "until=6h"Löscht auch baumelnde Bilder?
Variable

2) In Ihrem letzten Befehl erwähnen Sie docker image prune -f --filter "until=6h"- da es kein -a gibt - warum werden dann nicht verwendete Bilder entfernt?
Variable

0

Ich habe nützliche Befehle (Aliase) zum Entfernen baumelnder Bilder gesehen, mit freundlicher Genehmigung von andyneff hier: 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)' 

Der erste reinigt alle baumelnden Bilder. Dies ist nützlich, um Zwischenbilder zu entfernen, die von mehreren Builds übrig geblieben sind. Der zweite dient zum Entfernen angehaltener Container. Dies sind Aliase, die ich für die routinemäßige Wartung verwende

Wenn Sie den gesamten Cache entfernen möchten, müssen Sie zunächst sicherstellen, dass alle Container gestoppt und entfernt werden, da Sie ein von einem Container verwendetes Image nicht entfernen können. Also etwas ähnliches

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

Dies würde alle Bilder in Ihrem Cache töten und entfernen.


0

Im Screenshot der Bilder baumeln "keine" Namen. Ein baumelndes Bild bedeutet nur, dass Sie den neuen Build des Bildes erstellt haben, ihm jedoch kein neuer Name zugewiesen wurde. So werden die alten Bilder, die Sie haben, zum "baumelnden Bild". Diese alten Bilder sind diejenigen, die nicht markiert sind und "" auf ihrem Namen anzeigen, wenn Sie Docker-Bilder ausführen.

docker system prune -aentfernt es sowohl unbenutzte als auch baumelnde Bilder. Daher sind Bilder, die in einem Container verwendet werden, unabhängig davon, ob sie beendet wurden oder gerade ausgeführt werden, NICHT betroffen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.