Actuellement, vous ne pouvez pas utiliser l'API de registre pour cette tâche. Il vous permet uniquement de supprimer un référentiel ou une balise spécifique.
En général, la suppression d'un référentiel signifie que toutes les balises associées à ce référentiel sont supprimées.
La suppression d'une étiquette signifie que l'association entre une image et une étiquette est supprimée.
Aucun des éléments ci-dessus ne supprimera une seule image. Ils sont laissés sur votre disque.
solution de contournement
Pour cette solution de contournement, vous devez avoir vos images Docker stockées localement.
Une solution de contournement pour votre solution serait de supprimer toutes les balises sauf les dernières et donc de supprimer potentiellement la référence aux images associées. Ensuite, vous pouvez exécuter ce script pour supprimer toutes les images, qui ne sont référencées par aucune balise ou l'ascendance d'une image utilisée.
Terminologie (images et tags)
Considérons un graphique d'image comme celui - ci où les lettres majuscules ( A
, B
, ...) représentent court ID d'image et des <-
moyens que l'image est basée sur une autre image:
A <- B <- C <- D
Maintenant, nous ajoutons des balises à l'image:
A <- B <- C <- D
| |
| <version2>
<version1>
Ici, la balise fait <version1>
référence à l'image C
et la balise fait <version2>
référence à l'image D
.
Affiner votre question
Dans votre question, vous avez dit que vous vouliez supprimer
toutes les images sauf le latest
. Or, cette terminologie n'est pas tout à fait correcte. Vous avez mélangé des images et des tags. En regardant le graphique, je pense que vous conviendrez que la balise <version2>
représente la dernière version. En fait, selon cette question, vous pouvez avoir une balise qui représente la dernière version:
A <- B <- C <- D
| |
| <version2>
| <latest>
<version1>
Puisque la <latest>
balise fait référence à l'image, D
je vous demande: voulez-vous vraiment tout supprimer sauf l'image D
? Probablement pas!
Que se passe-t-il si vous supprimez une balise?
Si vous supprimez la balise <version1>
à l'aide de l'API Docker REST, vous obtiendrez ceci:
A <- B <- C <- D
|
<version2>
<latest>
N'oubliez pas: Docker ne supprimera jamais une image! Même si c'est le cas, dans ce cas, il ne peut pas supprimer une image, puisque l'image C
fait partie de l'ascendance de l'image D
qui est étiquetée.
Même si vous utilisez ce script , aucune image ne sera supprimée.
Quand une image peut être supprimée
Sous la condition que vous puissiez contrôler quand quelqu'un peut tirer ou pousser dans votre registre (par exemple en désactivant l'interface REST). Vous pouvez supprimer une image d'un graphique d'image si aucune autre image n'est basée dessus et qu'aucune balise n'y fait référence.
Notez que dans le graphique suivant, l'image D
n'est pas basée sur C
mais sur B
. Par conséquent, D
ne dépend pas de C
. Si vous supprimez la balise <version1>
dans ce graphique, l'image C
ne sera utilisée par aucune image et ce script peut la supprimer.
A <- B <--------- D
\ |
\ <version2>
\ <latest>
\ <- C
|
<version1>
Après le nettoyage, votre graphique d'image ressemble à ceci:
A <- B <- D
|
<version2>
<latest>
c'est ce que tu veux?