Docker Private Registry-excluiu todas as imagens, mas ainda está sendo exibido no catálogo

Seguindo a documentação oficial (https://docs.docker.com/registry/spec/api/#deleting-an-image) Consegui excluir com sucesso uma imagem. Como esperado, após a exclusão, a imagem não pode mais ser puxada nem seu manifesto chamado via API.

Eu sinto que tenho a parte difícil feita, no entanto, o problema é que o repo ainda está listado em /v2/_catalog depois que a exclusão for concluída. Estou tentando limpar completamente o registro.

Aqui está o meu arquivo de composição 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

Aqui está o método de alto nível sobre o que fiz para excluir a imagem:

  1. Reunir imagem digest: HEAD https://myprivateregistry:5001/v2/myimage/manifests/mytag com "Accept: application/vnd.docker.distribution.manifest.v2+json" adicionado ao cabeçalho na chamada

  2. A chamada retorna a chave do cabeçalho Docker-Content-Digest com um valor como sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  3. Usando esse valor da Etapa 2, execute a chamada de exclusão: DELETE https://myprivateregistry:5001/v2/myimage/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  4. API do registro retorna 202 Accepted

  5. Execute a coleta de lixo manualmente: registry garbage-collect /etc/docker/registry/config.yml

  6. O coletor de lixo exclui os blobs associados do disco (log omitido aqui, mas exclui com sucesso os blobs)

Neste ponto, posso confirmar que os blobs são completamente excluídos do disco e não posso mais chamar detalhes da imagem (como na Etapa 1 acima) então pensei que tinha acabado.

No entanto, ao executar: /v2/_catalog meu repo associado ainda Lista (mesmo que não haja imagens nele)! Obviamente, não pode puxar ou ser usado, mas Como posso remover totalmente esse repositório dessa lista agora que ele não tem imagens associadas a ele?

Eu não vejo em lugar nenhum como correctamente remova isso na página de documentação da API. Talvez eu esteja perdendo em algum lugar?

EDITAR -

Eu queria adicionar mais algumas informações sobre como o registro parece antes e depois que a exclusão acima ocorre.

Antes da Operação de exclusão acima:

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/...

Após a operação de exclusão acima:

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

Então a única coisa que sobrou é o _layers diretório com as mesmas camadas 5x listadas. Esta parece ser a razão pela qual ainda está listado em _catalog

Quando eu excluo o myimage pasta (de docker/registry/v2/repositories/myimage) então o repositório não é mais mostrado no _catalog

Este parece ser um método para expurgá-lo do _catalog listagem. No entanto-e se uma imagem tiver tags 2x, mas apenas 1 for excluída - há um motivo para excluir qualquer coisa de _layers nesse caso? Como isso seria tratado com várias versões de uma imagem? Obviamente eu não posso apenas clobber o _layers diretório como o método final, pois, no mundo real, haverá muitas versões marcadas de uma imagem. Portanto, isso precisa ser feito de forma inteligente.

Estou simplesmente achando difícil encontrar qualquer documentação sobre a manutenção/manutenção do registro Docker nem o esquema para o _layers subdiretório e por que o coletor de lixo não limpa esse diretório da mesma forma que faz com manifestos e blobs.

Depois de muita pesquisa, não existe um método atual para remover as entradas do catálogo totalmente apenas via API.

O registro v2 não permite excluir apenas certas tags de uma imagem

Isso significa que o imagem é excluído. A exclusão de tags está em um PR aberto para uma versão futura do registro (https://github.com/docker/distribution/pull/2169)

O que isso significa em relação a esta questão é que o método adequado é excluir a imagem da lista de repo é exatamente como você assumiu. Remova-o do disco. (Tais como rm -r v2/repositories/myimage onde myimage é o nome da imagem que você excluiu via API.)

Em seguida, ele será removido da lista de repo em _catalog e você terminou com seu processo de exclusão. Não há necessidade de reiniciar nada como outra resposta mencionada.

Quando a capacidade de excluir tags específicas do registro for adicionada, esse procedimento será alterado. Por enquanto é tudo ou nada.

Referência:

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/