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:
A <- B <- C <- D
Agora, adicionamos tags à imagem:
A <- B <- C <- D
| |
| <version2>
<version1>
Aqui, a tag faz <version1>
referência à imagem C
e a tag faz <version2>
referência à imagem D
.
Refinando sua pergunta
Na sua pergunta, você disse que queria remover
todas as imagens, exceto a latest
. 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:
A <- B <- C <- D
| |
| <version2>
| <latest>
<version1>
Como a <latest>
tag faz referência à imagem D
, pergunto: você realmente deseja excluir tudo menos a imagem D
? 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:
A <- B <- C <- D
|
<version2>
<latest>
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 imagem D
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 em C
mas B
. Portanto, D
não depende C
. Se você excluir a tag <version1>
neste gráfico, a imagem C
não será usada por nenhuma imagem e esse script poderá removê-la.
A <- B <--------- D
\ |
\ <version2>
\ <latest>
\ <- C
|
<version1>
Após a limpeza, seu gráfico de imagem fica assim:
A <- B <- D
|
<version2>
<latest>
É isso que voce quer?