J'exécute un registre de docker privé et je souhaite supprimer toutes les images sauf celles latest
d'un référentiel. Je ne veux pas supprimer tout le référentiel, juste certaines des images qu'il contient. Les documents de l'API ne mentionnent pas un moyen de le faire, mais c'est sûrement possible?
163
Réponses:
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:Maintenant, nous ajoutons des balises à l'image:
Ici, la balise fait
<version1>
référence à l'imageC
et la balise fait<version2>
référence à l'imageD
.Affiner votre question
Dans votre question, vous avez dit que vous vouliez supprimer
. 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:Puisque la
<latest>
balise fait référence à l'image,D
je vous demande: voulez-vous vraiment tout supprimer sauf l'imageD
? 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: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'imageD
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 surC
mais surB
. Par conséquent,D
ne dépend pas deC
. Si vous supprimez la balise<version1>
dans ce graphique, l'imageC
ne sera utilisée par aucune image et ce script peut la supprimer.Après le nettoyage, votre graphique d'image ressemble à ceci:
c'est ce que tu veux?
la source
J'ai rencontré le même problème avec mon registre, puis j'ai essayé la solution ci-dessous à partir d'une page de blog. Ça marche.
Étape 1: Liste des catalogues
Vous pouvez lister vos catalogues en appelant cette URL:
La réponse sera dans le format suivant:
Étape 2: Liste des balises pour le catalogue associé
Vous pouvez lister les balises de votre catalogue en appelant cette URL:
La réponse sera dans le format suivant:
}
Étape 3: Répertoriez la valeur du manifeste pour la balise associée
Vous pouvez exécuter cette commande dans le conteneur de registre docker:
La réponse sera dans le format suivant:
Exécutez la commande ci-dessous avec la valeur manifeste:
Étape 4: supprimer les manifestes marqués
Exécutez cette commande dans votre conteneur de registre docker:
Voici mon config.yml
la source
Deleteing blob: /docker/...
", mais cela n'a pas modifié l'espace disque utilisé. Utilisation de bin / registry github.com/docker/distribution v2.4.1 .Docker-Content-Digest
pièce doit être en minuscules (testé sur moteur 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)}'
Le courant
v2
registre prend désormais en charge la suppression par l' intermédiaireDELETE /v2/<name>/manifests/<reference>
Voir: https://github.com/docker/distribution/blob/master/docs/spec/api.md#deleting-an-image
Utilisation de travail: https://github.com/byrnedo/docker-reg-tool
Edit: Le manifeste
<reference>
ci-dessus peut être récupéré de la demande àGET /v2/<name>/manifests/<tag>
et vérifier l'en-
Docker-Content-Digest
tête de la réponse.Edit 2: Vous devrez peut-être exécuter votre registre avec l'ensemble d'environnement suivant:
REGISTRY_STORAGE_DELETE_ENABLED="true"
Edit3: Vous devrez peut-être exécuter un garbage collection pour libérer cet espace disque: https://docs.docker.com/registry/garbage-collection/
la source
DELETE
.{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
Problème 1
Vous avez mentionné qu'il s'agissait de votre registre docker privé, vous devez donc probablement vérifier l' API de registre au lieu de la documentation de l'API de registre Hub , qui est le lien que vous avez fourni.
Problème 2
L'API de registre docker est un protocole client / serveur, c'est à la mise en œuvre du serveur de décider s'il faut supprimer les images dans le back-end. (J'imagine)
Explication détaillée
Ci-dessous, je montre comment cela fonctionne maintenant à partir de votre description comme ma compréhension de vos questions.
Vous exécutez, vous exécutez le registre docker privé, j'utilise celui par défaut et j'écoute dans le
5000
portEnsuite, je marque l'image locale et j'y pousse.
Après cela, vous pouvez utiliser l' API de registre pour vérifier qu'elle existe dans votre registre docker privé
Maintenant, je peux supprimer la balise en utilisant cette API !!
Vérifiez à nouveau, la balise n'existe pas dans votre serveur de registre privé
la source
registry
image canonique . SSH et exécuter un script fonctionnent, même si ce n'est pas idéal. En remarque, je pense toujours que c'est une API incomplète - vous pouvez supprimer des balises, mais si vous OBTENEZ,/images
vous voyez toujours toutes les données d'image restantes.C'est vraiment moche mais ça marche, le texte est testé sur le registre: 2.5.1. Je n'ai pas réussi à faire fonctionner la suppression correctement, même après la mise à jour de la configuration pour activer la suppression. L'identifiant était vraiment difficile à récupérer, il a fallu se connecter pour l'obtenir, peut-être un malentendu. Quoi qu'il en soit, les travaux suivants:
Connectez-vous au conteneur
Définissez des variables correspondant à votre conteneur et à votre version de conteneur:
Accédez au répertoire du registre:
Supprimez les fichiers liés à votre hachage:
Supprimer les manifestes:
Se déconnecter
Exécutez le GC:
Si tout a été fait correctement, des informations sur les objets blob supprimés s'affichent.
la source
Il existe des clients (en Python, Ruby, etc.) qui font exactement cela. À mon goût, il n'est pas viable d'installer un runtime (par exemple Python) sur mon serveur de registre, juste pour gérer mon registre!
Alors
deckschrubber
ma solution:les images plus anciennes qu'un âge donné sont automatiquement supprimées. L' âge peut être spécifié en utilisant
-year
,-month
,-day
ou une combinaison d'entre eux:MISE À JOUR : voici une brève introduction sur deckschrubber.
la source
deckschrubber
est assez bon - très facile à installer (binaire unique), et vous permet de supprimer les images par nom (avec correspondance regex) ainsi que par âge.ERRO[0000] Could not delete image! repo=.... tag=latest
: /Brièvement;
1) Vous devez taper la commande suivante pour RepoDigests d'un repo docker;
2) Utiliser l'API REST du registre
Vous devriez obtenir un 202 Accepté pour un appel réussi.
3-) Exécutez Garbage Collector
registre - nom du conteneur de registre.
Pour plus d'explications détaillées, entrez la description du lien ici
la source
Cette image docker inclut un script bash qui peut être utilisé pour supprimer des images d'un registre v2 distant: https://hub.docker.com/r/vidarl/remove_image_from_registry/
la source
Sous le script Bash Supprime toutes les balises situées dans le registre à l'exception de la dernière.
Après cette course
la source
Script ruby simple basé sur cette réponse: registry_cleaner .
Vous pouvez l'exécuter sur une machine locale:
./registry_cleaner.rb --host=https://registry.exmpl.com --repository=name --tags_count=4
Et puis sur la machine de registre, supprimez les objets blob avec
/bin/registry garbage-collect /etc/docker/registry/config.yml
.la source
Voici un script basé sur la réponse de Yavuz Sert. Il supprime toutes les balises qui ne sont pas la dernière version et leur balise est supérieure à 950.
la source