Remover a imagem do docker no registro, removendo arquivos / pastas no servidor

1

Eu tenho o seguinte problema com a exclusão de uma imagem ou tag no docker-registry v2:

Eu tenho um servidor que executa um registro do docker. Eu criei uma imagem e a forcei, que agora quero ir embora. Agora eu quero remover a imagem (ou pelo menos a tag, se a imagem for impossível).

A versão atual do frontend não suporta essa funcionalidade.

Eu tentei por meio de um comando curl -u MY_USERNAME -X DELETE MY_DOMAIN:PORT/v2/IMAGE_NAME/manifests/REFERENCE , como HTTP API reference states, e digitei a senha, mas a execução resultou em uma linha vazia, nenhum erro de autenticação (a autenticação está ativada) ou uma mensagem de sucesso. A tag ainda está disponível.

Como tenho acesso ao servidor, tive a seguinte ideia: Posso simplesmente e muito bem remover a pasta v2/repositories/IMAGE_NAME/_manifests/tags/VERSION (ou outro arquivo / pasta)? Ou isso resulta em uma quebra do registro? Quais etapas iniciais, como parar o serviço de registro, tenho que fazer?

    
por Thomas Böhm 06.02.2018 / 16:40

1 resposta

1

Sim, eles não tornaram isso fácil e ainda não é perfeito, mas a API de registro v2 agora tem a capacidade de excluir imagens.

Can I simply and savely just remove the folder v2/repositories/IMAGE_NAME/_manifests/tags/VERSION

Os dados da imagem atual são armazenados no diretório de blobs no disco, mas eles são compartilhados entre manifestos diferentes, portanto não é seguro remover apenas esse diretório, a menos que você tenha considerado todas as imagens que possam compartilhar os blobs.

Here is the method to delete an image using the v2 docker API:

Em primeiro lugar, o seu registro precisa ter o DELETE ativado. Ou defina o env var:

REGISTRY_STORAGE_DELETE_ENABLED: "true"

ou no config.yml tem que definir

storage:
  delete:
    enabled: true

Em seguida, execute a exclusão por meio de chamadas de API (você pode testar facilmente via Postman ou usando curl / etc)

OBSERVAÇÃO: Nas chamadas abaixo, adicione "Accept: application/vnd.docker.distribution.manifest.v2+json" ao cabeçalho HTTP

  1. Reunir resumo de imagens:

    HEAD https://myprivateregistry:5001/v2/<image_name>/manifests/<image_tag>

    Esta chamada retorna a chave de cabeçalho Docker-Content-Digest com um valor como este: sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

  2. Usando esse valor da etapa 2, execute a chamada DELETE http:

    DELETE https://myprivateregistry:5001/v2/<image_name>/manifests/sha256:b57z31xyz0f616e65f106b424f4ef29185fbd80833255d79dabc73b8eb873bd

    API retorna 202 Accepted

  3. Execute a coleta de lixo manualmente se você não quiser esperar pela próxima execução programada: registry garbage-collect /etc/docker/registry/config.yml

    Exemplo se estiver executando o registro como um contêiner: docker exec -t registry-test ./bin/registry garbage-collect /etc/docker/registry/config.yml

    O coletor de lixo exclui os blobs e manifestos associados do disco para você.

Neste ponto, a tag image: é completamente excluída do disco e removida do registro. Os blobs são excluídos e você verá os manifestos desaparecerem de v2/repositories/<image_name>/_manifests

NOTA: Se esta foi a última imagem em seu repositório, você ainda terá que excluir manualmente a listagem de repo do disco ( v2/repositories/<image_name>/_layers ) - no entanto, isso é apenas metadados. Os dados da imagem real já foram removidos. Eu acredito que isso pode ser um bug no coletor de lixo. Eu tenho uma pergunta sobre isso aqui: Registro Privado do Docker - Todas as imagens foram excluídas, mas ainda estão sendo exibidas no catálogo

MAIS DETALHES:

link link

    
por 03.04.2018 / 21:27