Un poco de mantenimiento al docker registry

El registry necesita ser limpiado … Tenemos dos opciones

Pues eso, la primera es rápida y fácil pero un poco extrema y es simplemente eliminar el registry completo y volver a levantarlo, PERO TEN EN CUENTA QUE PERDERÁS ABSOLUTAMENTE TOOOODAS TUS IMÁGENES EN EL REGISTRY … de cualquier forma un nuevo pipeline para el build o los builds que necesites lo resolvería.

La segunda opción es revisar cada imagen y seleccionar las que queremos sean eliminadas. Elige…

1 - Rápida y fácil pero (posiblemente) loca

Si tu registry está ejecutándose, vamos a detenerlo y borrarlo:

    $ docker stop registry && docker rm registry

Y ahora, para que vuelva a sacar chispas y echar lumbre … pues démosle vida:

    $ docker run -d \                   
	  --restart=always \
	  --name registry \
	  -v ~/certs:/certs \
	  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
	  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
	  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
	  -e REGISTRY_STORAGE_DELETE_ENABLED=true \
	  -p 443:443 \
	  registry:2

Cuando levantamos el registry estamos pasándole el parámetro REGISTRY_STORAGE_DELETE_ENABLED, esto nos permitirá borrar parte de las imágenes que contiene el registry a través de su API.

Puedes revisar que está completamente limpio visitando la url del registry https://10.10.1.37/v2/_catalog y mirando si el arreglo repositories está vacío. It’s done.

2- Una opción más sensata(?)

Posiblemente si ejecutas un curl al registry obtengas el siguiente error:

$ curl -X GET https://10.10.1.37/v2/_catalog

curl: (60) SSL certificate problem: self signed certificate More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not establish a secure connection to it. To learn more about this situation and how to fix it, please visit the web page mentioned above.

Esto es porque necesitamos el certificado self signed “de confianza” pero vamos a hacer que curl confíe en nuestro servidor con un archivo cacert.pem…

$ echo quit | openssl s_client -showcerts -servername server -connect 10.10.1.37:443 > cacert.pem

Lo primero es saber qué imagenes están almacenadas dentro del registry:

$ curl --cacert cacert.pem https://10.10.1.37/v2/_catalog                      
{"repositories":["casey-stoner","valentino-rossi","andrea-iannone","jorge-lorenzo","marc-marquez","marco-simoncelli"]}

Ahora que sabemos cuáles son las imagenes que están almacenadas en nuestro registry, podemos investigar un poco sobre cuáles son los tags que tiene esa imagen:

$ curl --cacert cacert.pem https://10.10.1.37/v2/casey-stoner/tags/list
{"name":"casey stoner","tags":["australian","motogp","adriana","ducati","test"]}

Ahora que sabemos los tags que queremos eliminar, necesitamos saber el digest de la imagen, porque si intentamos borrar una imagen :

$ curl --request GET --cacert cacert.pem  -i -H "Accept: application/vnd.docker.distribution.manifest.v2+json" https://10.10.1.37/v2/casey-stoner/manifests/ducati
HTTP/2 200 
content-type: application/vnd.docker.distribution.manifest.v2+json
docker-content-digest: sha256:e83187c09cb0b2dd7ad168630430e4f0efc0459f2310d43f873e5058ca5d0341
docker-distribution-api-version: registry/2.0
etag: "sha256:e83187c09cb0b2dd7ad168630430e4f0efc0459f2310d43f873e5058ca5d0341"
x-content-type-options: nosniff
content-length: 1366
date: Thu, 15 Aug 2019 23:05:30 GMT

.
.
.

Lo que nos interesa del GET anterior es el parámetro docker-content-digest para poder eliminar las imagenes con el tag ducati en específico. Ahora podemos proceder a eliminar la imagen:

$ curl --request DELETE --cacert cacert.pem  -H "Accept: application/vnd.docker.distribution.manifest.v2+json" https://10.10.1.37/v2/casey-stoner/manifests/sha256:e83187c09cb0b2dd7ad168630430e4f0efc0459f2310d43f873e5058ca5d0341

Finalmente vamos a necesitar ejecutar el Garbage collector de Docker para que la eliminación se complete.

docker exec registry bin/registry garbage-collect --dry-run /etc/docker/registry/config.yml

Está hecho.

Con este segundo método podemos eliminar sólo los layers de las imágenes que nos interesan. No es tan salvaje como la opción número 1 y a la vez, siendo que tiene más pasos puede ser que te des cuenta de que estás a punto de borrar una imágen que tal vez no deberías antes de hacerlo. Pero como siempre, dependiendo de lo que necesites resolver, uno u otro método pueden servirte.

Nos leemos pronto!

comments powered by Disqus