Remova a imagem do docker no registro removendo arquivos / pastas no servidor

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 docker. Eu criei uma imagem e empurrou-o, que agora eu quero ser ido. Agora eu quero remover a imagem(ou pelo menos a tag, se a imagem impossível).

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

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

Como tenho acesso ao servidor, tive a seguinte ideia: posso simplesmente e savely apenas 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, eu tenho que fazer?

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.

Posso simplesmente e savely apenas remover a pasta v2 / repositories / IMAGE_NAME / _manifests / tags / VERSION

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

Aqui está o método para excluir uma imagem usando a API v2 docker:

Em primeiro lugar, seu registro deve ter a exclusão ativada. Ou definir o env var:

REGISTRY_STORAGE_DELETE_ENABLED: "true"

ou na configuração.yml tem que definir

storage:  delete:    enabled: true

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

NOTAR: Nas chamadas abaixo, Adicione "Accept: application/vnd.docker.distribution.manifest.v2+json" para o cabeçalho HTTP

  1. Reunir imagem digest:

    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 o DELETE chamada http:

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

    API retorna 202 Accepted

  3. Execute a coleta de lixo manualmente se não quiser esperar pela próxima execução agendada: 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 desaparecidos v2/repositories/<image_name>/_manifests

Nota: Se esta foi a última imagem em seu repo, você ainda tem que excluir manualmente a listagem de repo do disco (v2/repositories/<image_name>/_layers)- no entanto, isso é apenas metadados. Os dados reais da imagem já foram removidos. Eu acredito que isso pode ser um bug no coletor de lixo. Eu tenho uma pergunta sobre isso aqui: Docker Private Registry-excluiu todas as imagens, mas ainda está sendo exibido no catálogo

MAIS DETALHES:

https://docs.docker.com/registry/spec/api/#deleting-an-imagehttps://jsosic.wordpress.com/2017/01/23/deleting-images-from-docker-registry/