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:
-
Habilite la eliminación de imágenes configurando la variable de entorno
REGISTRY_STORAGE_DELETE_ENABLED: "true"
y pasándola a docker-Registry -
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
-
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
Se está discutiendo el diseño de esto; en este momento, no hay una herramienta de limpieza de capas / punto final.
Te animo a que vayas a:
y / o comuníquese con Freenode IRC en # docker-distribution para obtener más información.