Registro privado do Docker - Excluiu todas as imagens, mas ainda está mostrando no catálogo

2

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:

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

  2. A chamada retorna a chave de 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. A API do Registro retorna 202 Accepted

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

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

    
por emmdee 28.03.2018 / 20:59

1 resposta

0

Depois de muita pesquisa, não há nenhum método atual para remover totalmente as entradas do catálogo somente por meio da API.

The v2 registry doesn't allow deleting only certain tags from an image

Isso significa que a imagem inteira é excluída. A exclusão de tags está em um PR aberto para uma versão futura do Registro ( link )

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

Em seguida, ele será removido da lista de reporte em _catalog e você concluirá o 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 é adicionada, esse procedimento será alterado. Por enquanto é tudo ou nada.

Referência:

link

link

link

    
por 09.04.2018 / 20:34