Docker Registry 2.0 - comment supprimer des images non utilisées?

nous avons mis à jour notre registre privé des dockers au registre officiel 2.0. Cette version peut maintenant supprimer des images docker identifiées par un hashtag (voir https://docs.docker.com/registry/spec/api/#deleting-an-image) mais je ne vois toujours pas de moyen de nettoyer les vieilles images.

comme notre serveur CI produit continuellement de nouvelles images, j'aurais besoin d'une méthode pour supprimer toutes les images du registre privé qui ne sont plus identifiées par une balise nommée.

S'il n'y a pas pour y parvenir, je pense qu'un script personnalisé pourrait fonctionner, mais je ne vois pas non plus de méthode D'API v2 pour lister tous les hashtags stockés d'une image..

Comment puis-je garder mon registre privé propre? Tous les conseils?

38
demandé sur Kristof Jozsa 2015-04-22 18:28:05

6 réponses

suppression des images (vous pouvez garder 10 dernières versions, comme je le fais dans mon CI) est fait en trois étapes:

  1. activer la suppression d'image en définissant la variable d'environnement REGISTRY_STORAGE_DELETE_ENABLED: "true" et en passant à docker-registre

  2. Exécuter le script ci-dessous (il va supprimer toutes les images et les balises, mais garder les 10 dernières versions)

    registry.py -l utilisateur:pass-rhttps://example.com:5000 -- supprimer --no 10

  3. Exécuter la collecte des ordures (vous pouvez le mettre dans votre quotidien tâche cron)

    menu fixe-composer-f [path_to_your_docker_compose_file] de registre run bin/registre de garbage collect /etc/docker/registre/config.yml

registry.py peut être téléchargé à partir du lien ci-dessous, il permet également de lister des images, des balises et des calques, ainsi que la suppression d'une image particulière et / ou balise.

https://github.com/andrey-pohilko/registry-cli

avant la collecte des ordures mon dossier d'enregistrement était de 7 Go, après avoir exécuté les étapes ci-dessus, il s'est dégonflé jusqu'à 1 Go.

32
répondu anoxis 2017-03-13 16:53:18

C'est faisable, bien que laid. Vous devez exécuter (je pense) registry 2.3 ou plus, et avoir activé la suppression (REGISTRY_STORAGE_DELETE_ENABLED=True env var ou équivalent). Les commandes d'exemple ci-dessous supposent un filestore local dans /srv/docker-registry, mais je serais surpris si quelque chose d'équivalent ne pouvait pas être préparé pour d'autres supports de stockage.

Pour chaque dépôt que vous souhaitez ranger, vous devez énumérer les digérer les références qui ne sont plus nécessaires. La façon la plus facile de faire cela est par-étiquette, en utilisant latest comme exemple dans ce cas, vous feriez quelque chose comme:

ls /srv/docker-registry/v2/repositories/<repo>/_manifests/tags/index/latest/index/sha256 -t | tail -n +3

cette liste répertorie toutes les digest sauf les trois plus récents poussés vers le latest balise. Alternativement, si vous ne vous souciez pas de les balises beaucoup de choses, mais veulent juste garder le dernier peu de références poussé, vous pouvez faire:

ls /srv/docker-registry/v2/repositories/<repo>/_manifests/revisions/sha256 -t | tail -n +3

Alors, vous venez de supprimer les références que vous n'avez pas besoin:

for hash in ls /srv/docker-registry/v2/repositories/<repo>/_manifests/tags/index/latest/index/sha256 -t | tail -n +3); do curl -X DELETE https://registry:5000/v2/<repo>/manifests/sha256:$hash; done

enfin, vous devez faire un essai GC, parce que le registre implémente "soft deletes"", ce qui n'est pas réellement supprimer rien, il fait juste non disponible:

docker exec docker-registry /bin/registry garbage-collect /path/to/config.yml

Oui, tout est en désordre, rampant dans le stockage d'arrière-plan, parce qu'il n'y a pas de méthode API pour énumérer tous les digests associés à une étiquette donnée, mais c'est la façon dont le cookie s'effrite.

17
répondu womble 2016-08-18 23:58:49

il y a une discussion en cours pour concevoir ceci - en ce moment, il n'y a pas d'outil de nettoyage de la couche / point final.

je vous encourage à aller à:

et/ou rejoindre sur IRC Freenode #docker-distribution pour en savoir plus.

5
répondu Mangled Deutz 2015-04-23 10:49:55

Concernant votre question:

j'aurais besoin d'une méthode pour supprimer toutes les images de la privé de registre qui ne sont plus identifiés par un nom de balise

une nouvelle version du registre docker en distribution/registry:master a cette fonctionnalité sympa! Cependant, vous ne sera pas en mesure de le déclencher à partir de l'API.

de toute façon, vous serez en mesure de nettoyer tous les manifestes non étiquetés dans votre registre, ce qui signifie que chaque étiquette écrasée ne pas quitter les anciennes manifeste et les blobs dans le registre. Chaque couche "inutilisée" sera nettoyée par le collecteur D'ordures du registre.

Vous avez juste à lancer un docker exec:

docker exec ${container_id} registry garbage-collect \ 
  /path/to/your/registry/config.yml \
  --delete-untagged=true

en Regardant ces déchets-collecte binaire aider:

Usage: 
  registry garbage-collect <config> [flags]
Flags:
  -m, --delete-untagged=false: delete manifests that are not currently referenced via tag
  -d, --dry-run=false: do everything except remove the blobs
  -h, --help=false: help for garbage-collect

Vous pouvez avoir un coup d'oeil à l' GitHub PR. Il a été fusionné et utilisable avec distribution/registry, la balise master à partir de 2018-02-23. Il remplace le docker/docker-registry projet avec une nouvelle conception D'API, axée sur de sécurité et de performance...

j'ai utilisé cette fonctionnalité aujourd'hui et j'ai récupéré 89% de l'espace de registre (5,7 GO vs. 55 Go). Puis je suis revenu à stable registry.

3
répondu François Maturel 2018-05-15 17:59:09

je cherchais la même fonctionnalité dans l'api registry v2 mais j'ai trouvé seulement doux suppression qui n'est pas ce que je cherchais. En faisant des recherches, j'ai trouvé le projet Github supprimer-docker-registre-image qui supprime les fichiers réels du volume monté via un script bash. Pas testé, il peut-être utile...

2
répondu Endian Ogino 2016-04-03 19:19:26

j'ai assemblé diverses parties de ce fil et créé un script de nettoyage facile à utiliser à bash Vous pouvez le vérifier dans ce gist cleanup.sh

2
répondu Paul Robello 2017-08-31 23:48:20