Entfernen Sie das markierte Docker-Image aus der privaten Registrierung


10

Wie kann ich ein versehentlich hinzugefügtes Tag aus einem Bild in einer privaten Docker-Registrierung löschen? Die Option -rmi scheint in Docker 1.9.1 für Remote-Images nicht zu funktionieren.

user@ubuntu-user:~$ docker --version  
Docker version 1.9.1, build a34a1d5

user@ubuntu-user:~$ docker search myregistry:5000/user/image
NAME                                                                     
myregistry:5000/user/image:20160119                                         
myregistry:5000/user/image:20160119-20160120        

user@ubuntu-user:~$ docker rmi myregistry:5000/user/image:20160119-20160120
Error response from daemon: could not find image: no such id: myregistry:5000/user/image:20160119-20160120
Error: failed to remove images: [myregistry:5000/user/image:20160119-20160120]

Antworten:


9

Ab heute scheint es keine einfache Methode zu geben, um Bilder aus der Registrierung zu entfernen, und es scheint, als wäre dies eine Funktion für den Meilenstein von Registrierung 2.1 .

Eine der Optionen, die wir heute haben, funktioniert damit nicht

anovil@ubuntu-anovil remove-registry]$ curl -X DELETE localhost:5000/v2/alpine/manifests/v1
{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
[anovil@ubuntu-anovil remove-registry]$ 

ist es manuell aus der Registrierung selbst zu entfernen. Um zu vermeiden, dass versehentlich falsche Dateien entfernt werden, habe ich sie mit diesem Skript von github getestet . Ich übernehme keine Garantie dafür, wie dieses Skript funktioniert (obwohl ich es schnell überprüft habe, bevor ich es getestet habe).

Also habe ich einen Test gemacht und das scheint zu funktionieren :)

[1] Ich gehe davon aus, dass Sie eine Registrierung mit Docker selbst ausführen.

[anovil@ubuntu-anovil remove-registry]$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
88f8e1a1d7a7        registry:2          "/bin/registry /etc/d"   37 minutes ago      Up 37 minutes       0.0.0.0:5000->5000/tcp   registry
[anovil@ubuntu-anovil remove-registry]$ 

[2] Ich habe eine minimale Docker-Datei mit nur FROM alpineInhalten erstellt und alpine: v1 erstellt und in meine private Registrierung verschoben, die auf localhost: 5000 ausgeführt wird. Beim Abfragen aus der Registrierung wurde es wie erwartet zurückgegeben.

[anovil@ubuntu-anovil remove-registry]$ curl -X GET localhost:5000/v2/alpine/tags/list
{"name":"alpine","tags":["v1"]}
[anovil@ubuntu-anovil remove-registry]$ 

[3] Dann melde ich mich bei der Registrierung an docker execund überprüfe die Festplattennutzung, bevor ich mein Experiment durchführe

root@88f8e1a1d7a7:/# du -sch /var/lib/registry/                     
2.5M    /var/lib/registry/
2.5M    total
root@88f8e1a1d7a7:/# 

[4] Nachdem ich zu meinem Host zurückgekehrt war, kopierte ich eine schwere Datei (mongodb.tgz) in meinen Container und erstellte eine erstellte und gepusste Version v2.

[anovil@ubuntu-anovil remove-registry]$ docker build -t localhost:5000/alpine:v2 .
Sending build context to Docker daemon 61.99 MB
Step 1 : FROM alpine
 ---> 2314ad3eeb90
Step 2 : COPY mongodb.tgz /mongodb.tgz
 ---> d7c7645a3fe2
Successfully built d7c7645a3fe2
[anovil@ubuntu-anovil remove-registry]$ docker push localhost:5000/alpine:v2
The push refers to a repository [localhost:5000/alpine] (len: 1)
d7c7645a3fe2: Pushed 
5ff05309724e: Image already exists 
v2: digest: sha256:7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774 size: 4467
[anovil@ubuntu-anovil remove-registry]$ 

[5] Nach erneuter Überprüfung der Größe in der Registrierung wurde diese auf 62 MB erhöht:

root@88f8e1a1d7a7:/# du -sch /var/lib/registry/                                                                               
62M /var/lib/registry/
62M total
root@88f8e1a1d7a7:/# 

[6] Um ausgeführt zu werden delete_docker_registry_image, müssen Sie das Skript in den Container bringen, in dem sich die Registrierung befindet. Eine Option hierfür ist Curl. Auch dieses Skript erfordert jq.

root@88f8e1a1d7a7:/# apt-get update && apt-get install -y curl jq
...
root@88f8e1a1d7a7:/#

[7] Führen Sie das Skript aus, versuchen Sie es zuerst mit der --dry-runOption und vergessen Sie nicht das Versions-Tag (in diesem Fall v2). Es gibt auch ein gutes-h

root@88f8e1a1d7a7:/# delete_docker_registry_image --image alpine:v2 --dry-run
DRY_RUN: would have deleted tag directory: repositories/alpine/_manifests/tags/v2
DRY_RUN: would have deleted manifest revision: repositories/alpine/_manifests/revisions/sha256/7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774
DRY_RUN: would have deleted directory: blobs/sha256/e2/e2cc9aed084e01fa5cf93c09121035ac4d712113425ae68b678c28591beec5c6
DRY_RUN: would have deleted directory: blobs/sha256/7a/7ada67971e952e353ab14d8f9bdd4e41e4c41099b05a5da09f2700b51d93908a
DRY_RUN: would have deleted directory: blobs/sha256/7b/7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774
DRY_RUN: would have deleted layer metadata directory: repositories/alpine/_layers/sha256/e2cc9aed084e01fa5cf93c09121035ac4d712113425ae68b678c28591beec5c6
root@88f8e1a1d7a7:/# delete_docker_registry_image --image alpine:v2          
root@88f8e1a1d7a7:/#

[8] Und voila !!

root@88f8e1a1d7a7:/# du -sch /var/lib/registry/                     
2.5M    /var/lib/registry/
2.5M    total
root@88f8e1a1d7a7:/#  


0

Ich bin erst kürzlich selbst darauf gestoßen, habe dann aber gedacht, warum löschen, ich werde nur eine ältere Version erneut veröffentlichen:

docker push my/image:1.0.0
docker push my/image:1.0.1 # This is broken

docker tag  my/image:1.0.0 my/image:1.0.2
docker push my/image:1.0.2

Das kaputte Bild wird immer noch da sein, aber es ist unwahrscheinlich, dass jemand es verwenden wird, da eine "neuere" Version verfügbar ist. Natürlich ist es besser, vorwärts zu reparieren, aber zur Not ist dies eine schnelle Lösung.

Wenn der Grund, warum Sie es löschen möchten, darin besteht, dass es Geheimnisse oder etwas Enthülltes enthält, das Sie nicht herausholen wollten, sind die anderen Lösungen besser, aber nehmen Sie an, was auch immer jetzt bekannt ist, und ändern Sie es (Passwörter, Schlüssel, was auch immer).


1
Der erforderliche Speicherplatz wächst also und wächst, wenn mehr Bilder übertragen, aber nie gelöscht werden.
Emmdee

@emmdee gut, ich meine ja ... aber denk dran, in Bezug auf die Festplatte werden nur die Deltas zwischen den Revisionen gespeichert, genau wie bei git. Für ein Image mit einer Größe von 1 GB bedeutet dies nicht, dass bei jeder Veröffentlichung einer neuen Version weitere 1 GB auf der Festplatte verwendet werden.
Michael Butler
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.