web-dev-qa-db-fra.com

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

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

Comme notre serveur CI produit continuellement de nouvelles images, il me faudrait 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 de moyen intégré d'y parvenir, je pense qu'un script personnalisé pourrait éventuellement fonctionner, mais je ne vois pas non plus de méthode d'API v2 pour répertorier tous les hashtags stockés d'une image.

Comment puis-je garder mon registre privé propre? Des allusions?

53
Kristof Jozsa

La suppression d'images (vous pouvez conserver les 10 dernières versions, comme je le fais dans mon CI) se fait en trois étapes:

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

  2. Exécutez le script ci-dessous (il supprimera toutes les images et tous les tags mais conservera les 10 dernières versions)

    registry.py -l utilisateur: pass -r https://example.com:50 --delete --num 10

  3. Exécuter le ramassage des ordures (vous pouvez le mettre dans votre tâche quotidienne quotidienne)

    docker-compose -f [path_to_your_docker_compose_file] exécute le registre bin/registry garbage-collect /etc/docker/registry/config.yml

registry.py peut être téléchargé à partir du lien ci-dessous, il permet également de lister les images, les tags et les calques, ainsi que de supprimer une image et/ou un tag particulier.

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

Avant la collecte des ordures, mon dossier de registre était de 7 Go. Après avoir exécuté les étapes ci-dessus, il a été réduit à 1 Go.

46
anoxis

C'est faisable, bien que moche. Vous devez utiliser (je pense) le registre 2.3 ou plus, et avoir activé la suppression (REGISTRY_STORAGE_DELETE_ENABLED=True env var ou équivalent). Les exemples de commandes ci-dessous supposent un magasin de fichiers local dans /srv/docker-registry, mais je serais surpris si quelque chose d’équivalent ne pouvait pas être préparé pour d’autres systèmes de stockage.

Pour chaque référentiel que vous souhaitez ranger, vous devez énumérer les références de résumé qui ne sont plus nécessaires. Le moyen le plus simple de le faire est d'utiliser une balise, en utilisant latest comme exemple dans ce cas, vous feriez quelque chose comme:

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

Ceci listera tous les digests les plus récents poussés vers la balise latest. Alternativement, si vous ne vous souciez pas trop de tags, mais que vous voulez juste garder les dernières références importées, vous pouvez faire:

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

Ensuite, vous supprimez simplement les références dont vous n’avez pas besoin:

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

Enfin, vous devez effectuer une exécution sur le catalogue global, car le registre implémente des "suppressions logicielles", ce qui ne fait en réalité supprimer rien, cela le rend simplement indisponible:

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

Oui, tout cela est désordonné, se traînant dans le stockage principal, car il n'y a pas de méthode API permettant d'énumérer tous les résumés associés à une balise donnée, mais c'est ainsi que le cookie s'effrite.

19
womble

Concernant votre question:

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

Une nouvelle version du registre de docker dans distribution/registry:master a cette fonctionnalité intéressante! Cependant, vous ne pourrez pas le déclencher à partir de l'API .

Quoi qu'il en soit, vous pourrez nettoyer tous les manifestes non marqués de votre registre, ce qui signifie que toutes les balises écrasées ne laisseront pas d'anciens manifestes et blobs dans le registre. Chaque couche "non utilisée" sera nettoyée par le registre Garbage Collectior.

Vous devez juste lancer un docker exec:

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

En regardant cette aide binaire ramasse-miettes:

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 jeter un oeil au github PR . Il a été fusionné et utilisable avec distribution/registry, tag master à partir de 2018-02-23. Il remplace le docker/docker-registry projet avec une nouvelle conception d'API, axée sur la sécurité et la performance ...

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

15
François Maturel

Des discussions sont en cours pour concevoir cela - pour le moment, il n'y a pas d'outil de nettoyage de couche/noeud final.

Je vous encourage à aller à:

et/ou contacter Freenode IRC on # docker-distribution pour plus d'informations.

6
Mangled Deutz

J'ai reconstitué différentes parties de ce fil et créé un script de nettoyage facile à utiliser dans bash. Vous pouvez le vérifier dans ce Gist cleanup.sh

4
Paul Robello

Je cherchais la même fonctionnalité dans le registre v2 api mais seulement trouvé suppression douce qui n'est pas ce que je cherchais . Lors de mes recherches, j'ai trouvé le projet Github delete-docker-registry-image qui supprime les fichiers du volume monté via un script bash. Non testé cela peut être utile ...

3
Endian Ogino

I Host registry dans le conteneur docker avec le nom docker-registry_registry_1 De image: registry:2

Je viens de lancer garbage-collect Avec -m

docker exec docker-registry_registry_1 bin/registry garbage-collect /etc/docker/registry/config.yml -m
2