supprimer l'image Docker balisée du registre privé


10

Comment puis-je supprimer une balise ajoutée par erreur d'une image dans un registre Docker privé? L'option -rmi ne semble pas fonctionner pour les images distantes dans 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]

Réponses:


9

Il ne semble pas y avoir de méthode simple pour supprimer des images du registre à ce jour et ressemble à une fonctionnalité pour le jalon 2.1 du registre .

L'une des options que nous avons aujourd'hui avec cela ne fonctionne pas

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

consiste à le supprimer manuellement du registre lui-même. Juste pour éviter de supprimer accidentellement un mauvais fichier, je l'ai testé avec ce script dans github . Je ne prends aucune garantie sur le fonctionnement de ce script (même si je l'ai vérifié rapidement avant de le tester).

J'ai donc fait un test et ça semble marcher :)

[1] Je suppose que vous exécutez un registre avec Docker lui-même.

[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] J'ai créé un Dockerfile minimal avec juste du FROM alpinecontenu et créé alpine: v1 et poussé vers mon registre privé fonctionnant sur localhost: 5000. L'interroger à partir du Registre, il est revenu comme prévu.

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

[3] Ensuite, je me connecte au registre avec docker execet vérifie l'utilisation du disque avant de faire mon expérience

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

[4] Après être revenu sur mon hôte, j'ai copié un fichier lourd (mongodb.tgz) dans mon conteneur et créé une version v2 construite et poussée.

[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] Après avoir vérifié à nouveau la taille dans le registre, elle est passée à 62 Mo:

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

[6] Pour fonctionner delete_docker_registry_image, vous devez placer le script dans le conteneur qui héberge le registre, une option pour ce faire est avec curl. En outre, ce script nécessite jq.

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

[7] Exécutez le script, essayez d' --dry-runabord avec l' option et n'oubliez pas la balise de version (v2 dans ce cas), il y a aussi une bonne-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] Et le tour est joué !!

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


0

Récemment, j'ai moi-même rencontré cela, mais j'ai pensé, pourquoi supprimer, je vais juste rééditer une version plus ancienne:

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'image cassée sera toujours là, mais il est peu probable que quelqu'un l'utilise car une version "plus récente" est disponible. De toute évidence, il est préférable de fixer en avant, mais à la rigueur, c'est une solution rapide.

Si la raison pour laquelle vous voulez le supprimer est qu'il a des secrets ou quelque chose exposé que vous ne vouliez pas sortir, les autres solutions sont meilleures, mais supposez que ce qu'il était est maintenant connu et changez-le (mots de passe, clés, peu importe).


1
Ainsi, l'espace de stockage requis ne cesse de croître à mesure que davantage d'images sont poussées mais jamais purgées?
emmdee

@emmdee eh bien je veux dire ouais ... mais rappelez-vous, au niveau du disque, il ne s'agit que de stocker les deltas entre les révisions, tout comme git. pour une image qui finit par être 1 Go, cela ne signifie pas que chaque fois que vous publiez une nouvelle version, c'est un autre 1 Go utilisé sur le disque.
Michael Butler
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.