Registro privado de Docker: se eliminaron todas las imágenes, pero aún se muestran en el catálogo

Siguiendo la documentación oficial (https://docs.docker.com/registry/spec/api/#deleting-an-image) He podido eliminar con éxito una imagen. Como era de esperar, después de eliminar, la imagen ya no se puede extraer ni se puede llamar a su manifiesto a través de la API.

Siento que tengo la parte difícil hecha, sin embargo, el problema es que el repositorio todavía aparece en la lista /v2/_catalog una vez finalizada la eliminación. Estoy tratando de purgar completamente el registro.

Aquí está mi archivo de composición de registro:

registry:  image: registry:2.5.2  container_name: registry-test  ports:    - 5007:5000  environment:    REGISTRY_STORAGE: s3    REGISTRY_HTTP_TLS_CERTIFICATE: /etc/cert.crt    REGISTRY_HTTP_TLS_KEY: /etc/cert.key    REGISTRY_STORAGE_S3_ACCESSKEY: ******    REGISTRY_STORAGE_S3_SECRETKEY: ******    REGISTRY_STORAGE_S3_REGION: us-west-1    REGISTRY_STORAGE_S3_BUCKET: ******    REGISTRY_STORAGE_S3_SECURE: "true"    REGISTRY_STORAGE_DELETE_ENABLED: "true"  volumes:    - /dockerdata/volumes/registry-test/etc/cert.crt:/etc/cert.crt    - /dockerdata/volumes/registry-test/etc/cert.key:/etc/cert.key  restart: unless-stopped

Aquí está el método de alto nivel sobre lo que hice para eliminar la imagen:

  1. Resumen de imágenes de Gather: HEAD https://myprivateregistry:5001/v2/myimage/manifests/mytag con "Accept: application/vnd.docker.distribution.manifest.v2+json" añadido al encabezado de la llamada

  2. La llamada devuelve la clave de encabezado Docker-Content-Digest con un valor como sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  3. Usando ese valor del paso 2, ejecute la llamada delete: DELETE https://myprivateregistry:5001/v2/myimage/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  4. Devoluciones de API de registro 202 Accepted

  5. Ejecute la recolección de basura manualmente: registry garbage-collect /etc/docker/registry/config.yml

  6. El recolector de elementos no utilizados elimina los blobs asociados del disco (el registro se omite aquí, pero elimina los blobs correctamente)

En este punto, puedo confirmar que los blobs se eliminaron por completo del disco y ya no puedo llamar a los detalles de la imagen (como en el paso 1 anterior) así que pensé que había terminado.

Sin embargo, cuando se ejecuta: /v2/_catalog mi repositorio asociado todavía aparece en la lista (a pesar de que no hay imágenes dentro de él). Obviamente no puede tirar ni usarse, pero ¿cómo puedo eliminar completamente ese repositorio de esa lista ahora que no tiene imágenes asociadas?

No veo en ninguna parte cómo correctamente elimínelo en la página de documentación de la API. Tal vez me lo estoy perdiendo en alguna parte?

EDITAR -

Quería agregar más información sobre cómo se ve el registro antes y después de que se realice la eliminación anterior.

Antes de la Operación de Eliminación Anterior:

docker/registry/v2/repositories/myimage/_manifests/revisions/...docker/registry/v2/repositories/myimage/_manifests/tags/... docker/registry/v2/repositories/myimage/_layers/sha256/... (5 layers listed)docker/registry/v2/blobs/sha256/...

Después de la Operación de Eliminación Anterior:

docker/registry/v2/repositories/myimage/_layers/sha256/... (5 layers listed)

Así que lo único que queda es el _layers directorio con las mismas 5x capas listadas. Esta parece ser la razón por la que todavía figura en _catalog

Cuando borro el myimage carpeta (desde docker/registry/v2/repositories/myimage) entonces el repositorio ya no se muestra en el _catalog

Este parece ser un método para purgarlo de la _catalog listado. Sin embargo, ¿qué pasa si una imagen tiene 2x etiquetas, pero solo se elimina 1? _layers en ese caso? ¿Cómo se manejaría eso con múltiples versiones de una imagen? Obviamente, no puedo simplemente golpear el _layers directorio como método final ya que, en el mundo real, habrá muchas versiones etiquetadas de una imagen. Por lo tanto, esto debe hacerse de manera inteligente.

Simplemente me resulta difícil encontrar documentación sobre el mantenimiento/mantenimiento del registro de Docker ni el esquema para el _layers subdirectorio y por qué el recolector de basura no limpia ese directorio de la misma manera que lo hace con manifiestos y blobs.

Después de mucha investigación, no existe un método actual para eliminar completamente las entradas del catálogo solo a través de la API.

El registro v2 no permite eliminar solo ciertas etiquetas de una imagen

Esto significa que el imagen completa se suprime. La eliminación de etiquetas está en un proceso abierto para una versión futura del Registro (https://github.com/docker/distribution/pull/2169)

Qué significa esto con respecto a esta pregunta es que el método adecuado es eliminar la imagen de la lista de repositorios es exactamente como se supone. Retírelo del disco. (Por ejemplo rm -r v2/repositories/myimage donde myimage es el nombre de la imagen que eliminó a través de la API.)

A continuación, se eliminará de la lista de repositorios en _catalog y ha terminado con su proceso de eliminación. No es necesario reiniciar nada como otra respuesta mencionada.

Cuando se agrega la capacidad de eliminar etiquetas específicas del registro, este procedimiento cambiará. Por ahora es todo o nada.

Referencia:

https://forums.docker.com/t/delete-repository-from-v2-private-registry/16767/5

https://github.com/docker/distribution/pull/2169

https://docs.docker.com/registry/spec/api/