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:
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 chamadaA chamada retorna a chave do cabeçalho
Docker-Content-Digest
com um valor comosha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
Usando esse valor da Etapa 2, execute a chamada de exclusão:
DELETE https://myprivateregistry:5001/v2/myimage/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd
API do registro retorna
202 Accepted
Execute a coleta de lixo manualmente:
registry garbage-collect /etc/docker/registry/config.yml
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.