Ich führe eine private Docker-Registrierung aus und möchte alle Bilder außer den latest
aus einem Repository löschen . Ich möchte nicht das gesamte Repository löschen, sondern nur einige der darin enthaltenen Bilder. Die API-Dokumente erwähnen keine Möglichkeit, dies zu tun, aber es ist sicherlich möglich?
docker
docker-registry
Löwe
quelle
quelle
Antworten:
Derzeit können Sie die Registrierungs-API für diese Aufgabe nicht verwenden. Sie können nur ein Repository oder ein bestimmtes Tag löschen.
Im Allgemeinen bedeutet das Löschen eines Repositorys, dass alle diesem Repo zugeordneten Tags gelöscht werden.
Das Löschen eines Tags bedeutet, dass die Zuordnung zwischen einem Bild und einem Tag gelöscht wird.
Keines der oben genannten Elemente löscht ein einzelnes Bild. Sie verbleiben auf Ihrer Festplatte.
Problemumgehung
Für diese Problemumgehung müssen Ihre Docker-Images lokal gespeichert sein.
Eine Problemumgehung für Ihre Lösung besteht darin, alle bis auf die neuesten Tags zu löschen und dadurch möglicherweise den Verweis auf die zugehörigen Bilder zu entfernen. Anschließend können Sie dieses Skript ausführen , um alle Bilder zu entfernen, auf die von keinem Tag oder der Abstammung eines verwendeten Bildes verwiesen wird.
Terminologie (Bilder und Tags)
Betrachten wir ein Bild Graph wie dieser , wo die Großbuchstaben (
A
,B
, ...) Kurz Bild - IDs und stellen<-
bedeutet , dass ein Bild auf ein anderes Bild basiert:Jetzt fügen wir dem Bild Tags hinzu:
Hier wird der Tag
<version1>
verweist auf das BildC
und den Tag<version2>
verweist auf das BildD
.Verfeinern Sie Ihre Frage
In Ihrer Frage sagten Sie, dass Sie entfernen wollten
. Diese Terminologie ist nicht ganz richtig. Sie haben Bilder und Tags gemischt. Wenn Sie sich die Grafik ansehen, stimmen Sie zu, dass das Tag
<version2>
die neueste Version darstellt. In der Tat können Sie gemäß dieser Frage ein Tag haben, das die neueste Version darstellt:Da das
<latest>
Tag auf das Bild verweist,D
frage ich Sie: Wollen Sie wirklich alle außer dem Bild löschenD
? Wahrscheinlich nicht!Was passiert, wenn Sie ein Tag löschen?
Wenn Sie das Tag
<version1>
mit der Docker REST-API löschen, erhalten Sie Folgendes :Denken Sie daran: Docker löscht niemals ein Bild! Selbst wenn dies der Fall ist, kann in diesem Fall kein Bild gelöscht werden, da das Bild
C
Teil der Abstammung fürD
das mit Tags versehene Bild ist.Selbst wenn Sie dieses Skript verwenden , wird kein Bild gelöscht.
Wenn ein Bild gelöscht werden kann
Unter der Bedingung, dass Sie steuern können, wann jemand Ihre Registrierung abrufen oder verschieben kann (z. B. durch Deaktivieren der REST-Schnittstelle). Sie können ein Bild aus einem Bilddiagramm löschen, wenn kein anderes Bild darauf basiert und kein Tag darauf verweist.
Beachten Sie, dass in der folgenden Grafik, das Bild
D
wird nicht auf der Grundlage ,C
sondern aufB
. DaherD
hängt nicht davon abC
. Wenn Sie ein Tag<version1>
in diesem Diagramm löschen , wird das BildC
von keinem Bild verwendet, und dieses Skript kann es entfernen.Nach der Bereinigung sieht Ihr Bilddiagramm folgendermaßen aus:
Ist das was du willst?
quelle
Ich hatte das gleiche Problem mit meiner Registrierung, als ich die unten aufgeführte Lösung von einer Blog-Seite aus ausprobierte. Es klappt.
Schritt 1: Kataloge auflisten
Sie können Ihre Kataloge auflisten, indem Sie diese URL aufrufen:
Die Antwort hat das folgende Format:
Schritt 2: Auflisten von Tags für den zugehörigen Katalog
Sie können Tags Ihres Katalogs auflisten, indem Sie diese URL aufrufen:
Die Antwort hat das folgende Format:
}}
Schritt 3: Listen Sie den Manifestwert für das zugehörige Tag auf
Sie können diesen Befehl im Docker-Registrierungscontainer ausführen:
Die Antwort hat das folgende Format:
Führen Sie den folgenden Befehl mit dem Manifestwert aus:
Schritt 4: Löschen Sie markierte Manifeste
Führen Sie diesen Befehl in Ihrem Docker-Registrierungscontainer aus:
Hier ist meine config.yml
quelle
Deleteing blob: /docker/...
", aber der verwendete Speicherplatz wurde nicht geändert. Verwenden von bin / registry github.com/docker/distribution v2.4.1 .Docker-Content-Digest
Teil sollte in Kleinbuchstaben geschrieben sein (getestet mit Docker Engine v18.09.2), dhcurl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://localhost:5000/v2/<name>/manifests/<tag> 2>&1 | grep docker-content-digest | awk '{print ($3)}'
Die aktuelle
v2
Registrierung unterstützt jetzt das Löschen überDELETE /v2/<name>/manifests/<reference>
Siehe: https://github.com/docker/distribution/blob/master/docs/spec/api.md#deleting-an-image
Arbeitsnutzung: https://github.com/byrnedo/docker-reg-tool
Bearbeiten: Das
<reference>
obige Manifest kann von der Anforderung an abgerufen werdenGET /v2/<name>/manifests/<tag>
und Überprüfen des
Docker-Content-Digest
Headers in der Antwort.Bearbeiten 2: Möglicherweise müssen Sie Ihre Registrierung mit dem folgenden env-Satz ausführen:
REGISTRY_STORAGE_DELETE_ENABLED="true"
Edit3: Möglicherweise müssen Sie die Garbage Collection ausführen, um diesen Speicherplatz freizugeben: https://docs.docker.com/registry/garbage-collection/
quelle
DELETE
.{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
Problem 1
Sie haben erwähnt, dass es sich um Ihre private Docker-Registrierung handelt. Daher müssen Sie wahrscheinlich die Registrierungs-API anstelle des Hub-Registrierungs-API-Dokuments überprüfen , das der von Ihnen angegebene Link ist.
Problem 2
Die Docker-Registrierungs-API ist ein Client / Server-Protokoll. Es liegt an der Implementierung des Servers, ob die Images im Back-End entfernt werden sollen. (Ich vermute)
Detaillierte Erklärung
Unten zeige ich anhand Ihrer Beschreibung, wie es für Ihre Fragen funktioniert, wie es jetzt funktioniert.
Wenn Sie eine private Docker-Registrierung ausführen, verwende ich die Standardregistrierung und lausche im
5000
PortDann tagge ich das lokale Bild und drücke es hinein.
Danach können Sie mithilfe der Registrierungs-API überprüfen, ob sie in Ihrer privaten Docker-Registrierung vorhanden ist
Jetzt kann ich das Tag mit dieser API löschen !!
Überprüfen Sie erneut, ob das Tag auf Ihrem privaten Registrierungsserver nicht vorhanden ist
quelle
registry
Bild zu löschen . SSHing in und Ausführen eines Skripts funktioniert, auch wenn es nicht ideal ist. Als Randnotiz denke ich immer noch, dass es eine unvollständige API ist - Sie können Tags löschen, aber wenn Sie GET bekommen, sehen/images
Sie immer noch alle übrig gebliebenen Bilddaten.Das ist wirklich hässlich, aber es funktioniert, Text wird in der Registrierung getestet: 2.5.1. Ich habe es nicht geschafft, dass das Löschen reibungslos funktioniert, selbst nachdem die Konfiguration aktualisiert wurde, um das Löschen zu aktivieren. Die ID war wirklich schwer abzurufen, musste sich anmelden, um sie zu erhalten, vielleicht ein Missverständnis. Auf jeden Fall funktioniert folgendes:
Melden Sie sich beim Container an
Definieren Sie Variablen, die Ihrem Container und Ihrer Containerversion entsprechen:
Wechseln Sie in das Registrierungsverzeichnis:
Löschen Sie Dateien, die sich auf Ihren Hash beziehen:
Manifeste löschen:
Ausloggen
Führen Sie den GC aus:
Wenn alles richtig gemacht wurde, werden einige Informationen zu gelöschten Blobs angezeigt.
quelle
Es gibt einige Clients (in Python, Ruby usw.), die genau das tun. Für meinen Geschmack ist es nicht nachhaltig, eine Laufzeit (z. B. Python) auf meinem Registrierungsserver zu installieren, nur um meine Registrierung zu verwalten!
So
deckschrubber
ist meine Lösung:Bilder, die älter als ein bestimmtes Alter sind, werden automatisch gelöscht. Das Alter kann angegeben werden
-year
,-month
,-day
oder eine Kombination von ihnen:UPDATE : Hier ist eine kurze Einführung zu Deckschrubber.
quelle
deckschrubber
ist ziemlich gut - sehr einfach zu installieren (einzelne Binärdatei) und ermöglicht das Löschen von Bildern nach Namen (mit Regex-Übereinstimmung) sowie nach Alter.ERRO[0000] Could not delete image! repo=.... tag=latest
: /Kurz;
1) Sie müssen den folgenden Befehl für RepoDigests eines Docker-Repos eingeben.
2) Verwenden Sie die Registrierungs-REST-API
Sie sollten eine 202 Accepted für einen erfolgreichen Aufruf erhalten.
3-) Führen Sie Garbage Collector aus
Registrierung - Name des Registrierungscontainers.
Für eine ausführlichere Erklärung geben Sie hier die Linkbeschreibung ein
quelle
Dieses Docker-Image enthält ein Bash-Skript, mit dem Images aus einer Remote-v2-Registrierung entfernt werden können: https://hub.docker.com/r/vidarl/remove_image_from_registry/
quelle
Unterhalb des Bash-Skripts Löscht alle in der Registrierung befindlichen Tags mit Ausnahme der neuesten.
Nach diesem Lauf
quelle
Einfaches Ruby-Skript basierend auf dieser Antwort: registry_cleaner .
Sie können es auf einem lokalen Computer ausführen:
./registry_cleaner.rb --host=https://registry.exmpl.com --repository=name --tags_count=4
Und dann auf dem Registrierungscomputer Blobs mit entfernen
/bin/registry garbage-collect /etc/docker/registry/config.yml
.quelle
Hier ist ein Skript, das auf der Antwort von Yavuz Sert basiert. Es werden alle Tags gelöscht, die nicht die neueste Version sind, und ihr Tag ist größer als 950.
quelle