Eu executo um registro de janela de encaixe privado e desejo excluir todas as imagens, exceto as latest
de um repositório. Não quero excluir o repositório inteiro, apenas algumas das imagens dentro dele. Os documentos da API não mencionam uma maneira de fazer isso, mas certamente é possível?
162
Respostas:
Atualmente, você não pode usar a API do Registro para essa tarefa. Permite apenas excluir um repositório ou uma tag específica.
Em geral, excluir um repositório significa que todas as tags associadas a este repositório são excluídas.
Excluir uma tag significa que a associação entre uma imagem e uma tag é excluída.
Nenhuma das opções acima excluirá uma única imagem. Eles são deixados no seu disco.
Gambiarra
Para esta solução alternativa, você precisa ter as imagens do docker armazenadas localmente.
Uma solução alternativa para sua solução seria excluir todas as tags, exceto as mais recentes, e, assim, remover potencialmente a referência às imagens associadas. Em seguida, você pode executar esse script para remover todas as imagens que não são referenciadas por nenhuma tag ou ancestralidade de qualquer imagem usada.
Terminologia (imagens e tags)
Considere um gráfico de imagem como este, onde as letras maiúsculas (
A
,B
...) representam IDs curtos da imagem e<-
significa que uma imagem é baseada em outra imagem:Agora, adicionamos tags à imagem:
Aqui, a tag faz
<version1>
referência à imagemC
e a tag faz<version2>
referência à imagemD
.Refinando sua pergunta
Na sua pergunta, você disse que queria remover
. Agora, essa terminologia não está totalmente correta. Você misturou imagens e tags. Olhando para o gráfico, acho que você concorda que a tag
<version2>
representa a versão mais recente. De fato, de acordo com esta pergunta, você pode ter uma tag que representa a versão mais recente:Como a
<latest>
tag faz referência à imagemD
, pergunto: você realmente deseja excluir tudo menos a imagemD
? Provavelmente não!O que acontece se você excluir uma tag?
Se você excluir a tag
<version1>
usando a API REST do Docker, obterá o seguinte:Lembre-se: o Docker nunca excluirá uma imagem! Mesmo assim, neste caso, não pode excluir uma imagem, pois ela
C
faz parte da ancestralidade da imagemD
que está marcada.Mesmo se você usar esse script , nenhuma imagem será excluída.
Quando uma imagem pode ser excluída
Sob a condição de que você pode controlar quando alguém pode puxar ou enviar por push ao seu registro (por exemplo, desativando a interface REST). Você pode excluir uma imagem de um gráfico de imagem se nenhuma outra imagem for baseada nela e nenhuma tag se referir a ela.
Note que no gráfico a seguir, a imagem
D
é não baseado emC
masB
. Portanto,D
não dependeC
. Se você excluir a tag<version1>
neste gráfico, a imagemC
não será usada por nenhuma imagem e esse script poderá removê-la.Após a limpeza, seu gráfico de imagem fica assim:
É isso que voce quer?
fonte
Eu enfrentei o mesmo problema com meu registro e tentei a solução listada abaixo em uma página de blog. Funciona.
Etapa 1: Listando Catálogos
Você pode listar seus catálogos chamando este URL:
A resposta estará no seguinte formato:
Etapa 2: listando tags para o catálogo relacionado
Você pode listar as tags do seu catálogo chamando este URL:
A resposta estará no seguinte formato:
}
Etapa 3: listar o valor do manifesto para a tag relacionada
Você pode executar este comando no contêiner de registro do docker:
A resposta estará no seguinte formato:
Execute o comando fornecido abaixo com o valor do manifesto:
Etapa 4: excluir manifestos marcados
Execute este comando no seu contêiner do docker registry:
Aqui está o meu config.yml
fonte
Deleteing blob: /docker/...
" mas não alteraram o espaço em disco usado. Usando bin / registry github.com/docker/distribution v2.4.1 .Docker-Content-Digest
peça deve estar em minúscula (testada no mecanismo docker v18.09.2) iecurl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://localhost:5000/v2/<name>/manifests/<tag> 2>&1 | grep docker-content-digest | awk '{print ($3)}'
O
v2
registro atual agora suporta a exclusão viaDELETE /v2/<name>/manifests/<reference>
Consulte: https://github.com/docker/distribution/blob/master/docs/spec/api.md#deleting-an-image
Uso de trabalho: https://github.com/byrnedo/docker-reg-tool
Editar: o manifesto
<reference>
acima pode ser recuperado da solicitação paraGET /v2/<name>/manifests/<tag>
e verificando o
Docker-Content-Digest
cabeçalho na resposta.Editar 2: pode ser necessário executar seu registro com o seguinte conjunto de env:
REGISTRY_STORAGE_DELETE_ENABLED="true"
Edit3: Talvez você precise executar a coleta de lixo para liberar esse espaço em disco: https://docs.docker.com/registry/garbage-collection/
fonte
DELETE
.{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
Problema 1
Você mencionou que era seu registro da janela de encaixe privada, portanto, provavelmente você precisa verificar a API do Registro em vez do documento da API do Registro do Hub , que é o link que você forneceu.
Problema 2
A API do registro do docker é um protocolo de cliente / servidor; depende da implementação do servidor a remoção das imagens no back-end. (Eu acho)
Explicação detalhada
Abaixo, demonstro como funciona agora a partir da sua descrição como meu entendimento para suas perguntas.
Você executa, você executa o registro do docker privado, eu uso o padrão e ouço na
5000
portaDepois, identifico a imagem local e empurro para dentro dela.
Depois disso, você pode usar a API do Registro para verificar se ela existe no registro do docker privado
Agora eu posso excluir a tag usando essa API !!
Verifique novamente, a tag não existe no seu servidor de registro privado
fonte
registry
imagem canônica . Fazer o SSH e executar um script funciona, mesmo que não seja o ideal. Como observação, ainda acho que é uma API incompleta - você pode excluir tags, mas, se obtiver,/images
ainda verá todos os dados restantes da imagem.Isso é realmente feio, mas funciona, o texto é testado no registro: 2.5.1. Não consegui fazer com que a exclusão funcionasse sem problemas, mesmo depois de atualizar a configuração para ativar a exclusão. O ID era realmente difícil de recuperar, tinha que fazer login para obtê-lo, talvez algum mal-entendido. De qualquer forma, o seguinte funciona:
Faça login no contêiner
Defina variáveis que correspondem ao seu contêiner e sua versão:
Vá para o diretório do registro:
Exclua arquivos relacionados ao seu hash:
Excluir manifestos:
Sair
Execute o GC:
Se tudo foi feito corretamente, algumas informações sobre os blobs excluídos são mostradas.
fonte
Existem alguns clientes (em Python, Ruby, etc) que fazem exatamente isso. Para meu gosto, não é sustentável instalar um tempo de execução (por exemplo, Python) no meu servidor de registro, apenas para manter meu registro em casa!
Então
deckschrubber
é a minha solução:imagens com mais de uma idade são excluídas automaticamente. Idade pode ser especificado usando
-year
,-month
,-day
ou uma combinação dos mesmos:ATUALIZAÇÃO : aqui está uma breve introdução ao deckschrubber.
fonte
deckschrubber
é muito bom - muito fácil de instalar (binário único) e permite excluir imagens por nome (com correspondência de expressões regulares) e idade.ERRO[0000] Could not delete image! repo=.... tag=latest
: /Resumidamente;
1) Você deve digitar o seguinte comando para RepoDigests de um repo de docker;
2) Use a API REST do registro
Você deve obter um 202 aceito para uma chamada bem-sucedida.
3-) Execute o coletor de lixo
registro - nome do contêiner de registro.
Para uma explicação mais detalhada, insira a descrição do link aqui
fonte
Esta imagem do docker inclui um script bash que pode ser usado para remover imagens de um registro v2 remoto: https://hub.docker.com/r/vidarl/remove_image_from_registry/
fonte
Script abaixo do bash Exclui todas as marcas localizadas no registro, exceto as mais recentes.
Após esta execução
fonte
Script ruby simples com base nesta resposta: registry_cleaner .
Você pode executá-lo na máquina local:
./registry_cleaner.rb --host=https://registry.exmpl.com --repository=name --tags_count=4
E então na máquina do registro remova os blobs com
/bin/registry garbage-collect /etc/docker/registry/config.yml
.fonte
Aqui está um script baseado na resposta de Yavuz Sert. Exclui todas as tags que não são a versão mais recente e sua tag é maior que 950.
fonte