rimuovere l'immagine Docker taggata dal registro privato


10

Come posso eliminare un tag aggiunto erroneamente da un'immagine in un registro Docker privato? L'opzione -rmi non sembra funzionare per le immagini remote in Docker 1.9.1.

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]

Risposte:


9

Non sembra esserci un metodo semplice per rimuovere le immagini dal registro ad oggi e sembra che sia una caratteristica per il traguardo del registro 2.1 .

Una delle opzioni che abbiamo oggi con questo non funziona

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]$ 

è di rimuoverlo manualmente dal registro stesso. Solo per evitare di rimuovere accidentalmente file errati, l'ho provato con questo script da Github . Non garantisco il funzionamento di questo script (anche se l'ho verificato rapidamente prima di testarlo).

Quindi, ho fatto un test e sembra funzionare :)

[1] Presumo che tu stia eseguendo un registro con la stessa finestra mobile.

[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] Ho creato un Dockerfile minimo con solo FROM alpinecontenuto e creato alpine: v1 e ho inserito il mio registro privato in esecuzione su localhost: 5000. Interrogandolo dal registro, è tornato come previsto.

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

[3] Quindi accedo al registro con docker exece ho verificato l'utilizzo del disco prima di fare il mio esperimento

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

[4] Dopo essere tornato sul mio host, ho copiato un file pesante (mongodb.tgz) nel mio contenitore e ho creato una versione v2 integrata e spinta.

[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] Dopo aver ricontrollato le dimensioni nel registro, è aumentato a 62 MB:

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

[6] Per eseguire delete_docker_registry_image, è necessario inserire lo script nel contenitore che ospita il registro, un'opzione per farlo è con il ricciolo. Inoltre, questo script richiede jq.

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

[7] Esegui lo script, prova --dry-runprima con l' opzione e non dimenticare il tag della versione (v2 in questo caso), c'è anche un buon-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] E voilà !!

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


0

Di recente mi sono imbattuto in questo, ma poi ho pensato, perché eliminare, rilascerò solo una versione precedente:

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

L'immagine rotta sarà ancora lì, ma è improbabile che qualcuno la usi in quanto è disponibile una versione "più recente". Ovviamente è meglio sistemare in avanti ma in un pizzico questa è una soluzione veloce.

Se il motivo per cui vuoi eliminarlo è che ha segreti o qualcosa di scoperto che non volevi uscire, le altre soluzioni sono migliori, ma supponi che ciò che era ora è noto e modificalo (password, chiavi, qualunque cosa).


1
Quindi lo spazio di archiviazione richiesto cresce e cresce man mano che più immagini vengono spinte ma mai eliminate?
emmdee,

@emmdee bene intendo sì ... ma ricorda, per quanto riguarda il disco, sta solo memorizzando i delta tra le revisioni, proprio come git. per un'immagine che finisce per essere 1 GB, ciò non significa che ogni volta che rilasci una nuova versione è un altro 1 GB in uso sul disco.
Michael Butler,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.