Seguindo a documentação oficial ( link ), consegui excluir com êxito 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, no entanto, o problema é que o repositório ainda está listado em /v2/_catalog
após a exclusão ser concluída. Estou tentando remover totalmente o conteúdo registro.
Aqui está o meu arquivo de composição do 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 eu fiz para excluir a imagem:
-
Reunir resumo da imagem:
HEAD https://myprivateregistry:5001/v2/myimage/manifests/mytag
com "Accept: application/vnd.docker.distribution.manifest.v2+json"
adicionado ao cabeçalho da chamada
-
A chamada retorna a chave de cabeçalho Docker-Content-Digest
com um valor como sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
-
Usando esse valor da etapa 2, execute a chamada de exclusão: DELETE https://myprivateregistry:5001/v2/myimage/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
-
A API do Registro retorna 202 Accepted
-
Executar a coleta de lixo manualmente: registry garbage-collect /etc/docker/registry/config.yml
-
Coletor de lixo exclui os blobs associados do disco (log omitido aqui, mas exclui com êxito os blobs)
Neste ponto, posso confirmar que os blobs estão completamente excluídos do disco e não posso mais chamar os detalhes da imagem (como na etapa 1 acima) , então achei que estava pronto.
No entanto, quando estiver em execução: /v2/_catalog
minhas listas de repositórios estáticos ainda associados (mesmo que não haja imagens dentro dele) Obviamente, ele não pode ser usado ou usado, mas como posso remover o repositório da lista agora que não tem imagens associadas?
I don't see anywhere how to properly remove this on the API documentation page.
Perhaps I'm missing it somewhere?
EDITAR
Eu queria adicionar mais algumas informações sobre a aparência do registro antes e depois da exclusão acima.
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)
Portanto, a única coisa que resta é o diretório _layers
com as mesmas cinco camadas listadas. Esta parece ser a razão pela qual ele ainda está listado em _catalog
Quando eu excluir a pasta myimage
(de docker/registry/v2/repositories/myimage
), o repositório não será mais mostrado no _catalog
Este parece ser um método para limpá-lo da listagem _catalog
. No entanto - e se uma imagem tiver 2x tags, 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, não posso simplesmente destruir o diretório _layers
como o método final, já que, no mundo real, haverá muitas versões marcadas de uma imagem. Portanto, isso precisa ser feito de maneira inteligente.
I am simply finding it hard to find any documentation on the maintenance/upkeep of the Docker registry nor the schema for the _layers
subdirectory and why the garbage collector doesn't clean up that directory the same it does with manifests and blobs.