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?
La suppression d'images (vous pouvez conserver les 10 dernières versions, comme je le fais dans mon CI) se fait en trois étapes:
Activer la suppression d'image en définissant la variable d'environnement REGISTRY_STORAGE_DELETE_ENABLED: "true"
et en le passant à docker-registry
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
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.
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.
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
.
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.
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
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 ...
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