tag run remove hub example compose docker docker-registry

run - docker tag example



Docker Registry 2.0: ¿cómo eliminar imágenes no utilizadas? (7)

Actualizamos nuestro registro de acopladores privados al Registro oficial 2.0. Esta versión ahora puede eliminar las imágenes acopladas identificadas por un hashtag (consulte https://docs.docker.com/registry/spec/api/#deleting-an-image ) pero todavía no veo una manera de limpiar imágenes antiguas.

Como nuestro servidor CI está produciendo continuamente nuevas imágenes, necesitaría un método para eliminar todas las imágenes del registro privado que ya no se identifican con una etiqueta con nombre.

Si no hay una forma integrada de lograr esto, creo que un script personalizado podría funcionar, pero tampoco veo un método v2 API para enumerar todos los hashtags almacenados de una imagen.

¿Cómo puedo mantener limpio mi registro privado? ¿Alguna pista?


Alojo regestry en el contenedor de docker con el nombre docker-registry_registry_1 Registry_registry_1 de la image: registry:2

Acabo de ejecutar garbage-collect con -m

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


Con respecto a su pregunta:

Necesitaría un método para eliminar todas las imágenes del registro privado que ya no se identifican con una etiqueta con nombre

Una nueva versión del registro de docker en distribution/registry:master tiene esta buena característica! Sin embargo, no podrá activarlo desde la API .

De todos modos, podrá limpiar todos los manifiestos sin etiquetar en su registro, lo que significa que cada etiqueta sobrescrita no dejará manifiestos y blobs antiguos en el registro. Cada registro "no utilizado" será limpiado por Registry Garbage Collectior.

Solo tienes que ejecutar un docker exec :

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

Mirando esta ayuda binaria de recolección de basura:

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

Puedes echar un vistazo al github PR . Se ha fusionado y utilizable con distribution/registry , etiqueta master partir del 2018-02-23. Reemplaza el proyecto docker/docker-registry con un nuevo diseño de API, centrado en la seguridad y el rendimiento ...

Utilicé esta característica hoy y recuperé el 89% del espacio de registro (5,7 GB frente a 55 GB). Luego volví al registry estable.


Estaba buscando la misma funcionalidad en la API del registro v2, pero solo encontré una eliminación suave que no es lo que estaba buscando. Mientras investigaba, encontré el proyecto Github delete-docker-registry-image que elimina los archivos reales del volumen montado a través de un script bash. No probado, puede ser útil ...


Esto es factible, aunque feo. Debe estar ejecutando (creo) el registro 2.3 o superior, y haber habilitado la eliminación ( REGISTRY_STORAGE_DELETE_ENABLED=True env var o equivalente). Los comandos de ejemplo a continuación suponen un almacén de archivos local en /srv/docker-registry Registry, pero me sorprendería si no se pudiera preparar algo equivalente para otros backends de almacenamiento.

Para cada repositorio que desee ordenar, debe enumerar las referencias de resumen que ya no son necesarias. La forma más fácil de hacer esto es por etiqueta, usando lo latest como ejemplo en este caso, haría algo como:

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

Esto mostrará una lista de todos, excepto los tres resúmenes más recientes enviados a la latest etiqueta. Alternativamente, si no le importan tanto las etiquetas , pero solo desea mantener las últimas referencias, puede hacer lo siguiente:

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

Luego, simplemente elimine las referencias que no necesita:

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

Finalmente, necesita hacer una ejecución de GC, porque el registro implementa "eliminaciones suaves", que en realidad no elimina nada, simplemente lo hace no disponible:

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

Sí, todo esto es desordenado, arrastrándose en el almacenamiento de back-end, porque no hay un método API para enumerar todos los resúmenes asociados con una etiqueta determinada, pero esa es la forma en que la cookie se desmorona.


La eliminación de imágenes (puede mantener 10 últimas versiones, como lo hago en mi CI) se realiza en tres pasos:

  1. Habilite la eliminación de imágenes configurando la variable de entorno REGISTRY_STORAGE_DELETE_ENABLED: "true" y pasándola a docker-Registry

  2. Ejecute la secuencia de comandos a continuación (eliminará todas las imágenes y etiquetas, pero conservará las últimas 10 versiones)

    Registry.py -l usuario: pass -r https://example.com:5000 --delete --num 10

  3. Ejecute la recolección de basura (puede ponerlo en su tarea cron diaria)

    docker-compose -f [path_to_your_docker_compose_file] ejecutar bin del registro / registro de recolección de basura /etc/docker/registry/config.yml

Registry.py se puede descargar desde el siguiente enlace, también permite enumerar imágenes, etiquetas y capas, así como eliminar una imagen y / o etiqueta en particular.

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

Antes de la recolección de basura, mi carpeta de registro era de 7 Gb, después de ejecutar los pasos anteriores, se desinfló a 1 Gb.


Reuní varias partes de este hilo y creé un script de limpieza fácil de usar en bash. Puedes verlo en este cleanup.sh