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:
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 llamadaLa llamada devuelve la clave de encabezado
Docker-Content-Digest
con un valor comosha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
Usando ese valor del paso 2, ejecute la llamada delete:
DELETE https://myprivateregistry:5001/v2/myimage/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
Devoluciones de API de registro
202 Accepted
Ejecute la recolección de basura manualmente:
registry garbage-collect /etc/docker/registry/config.yml
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.