Supprimer des images conteneur dans Azure Container Registry

Pour limiter la taille de votre registre de conteneurs Azure, vous devez supprimer régulièrement les données d’image obsolètes. Certaines images conteneur déployées dans l’environnement de production peuvent nécessiter un stockage à long terme, mais d’autres peuvent être supprimées plus rapidement. Par exemple, dans un scénario de génération et de tests automatisés, votre registre peut se remplir rapidement d’images qui peuvent ne jamais être déployées, et peuvent donc être vidées peu après la génération et la réussite des tests.

Il existe plusieurs façons de supprimer les données d’image, et il est important de comprendre comment chaque opération de suppression affecte l’utilisation du stockage. Cet article décrit plusieurs méthodes de suppression de données d’image :

  • En supprimant un référentiel : de cette façon, vous supprimez toutes les images et tous les calques contenus dans le référentiel.
  • En supprimant en fonction de l’étiquette : de cette façon, vous supprimez une image, son étiquette, tous les calques référencés par l’image et toutes les autres étiquettes associées à l’image.
  • En supprimant en fonction du code de hachage du manifeste : de cette façon, vous supprimez une image, tous les calques référencés par l’image et toutes les autres étiquettes associées à l’image.

Pour une présentation de ces concepts, consultez À propos des registres, des dépôts et des images.

Notes

Une fois que vous avez supprimé des données d’image, Azure Container Registry arrête la facturation immédiatement pour le stockage associé. Toutefois, le registre récupère l’espace de stockage associé à l’aide d’un processus asynchrone. Il faut un certain temps avant que le registre nettoie les couches et montre l’utilisation mise à jour du stockage.

Supprimer le référentiel

La suppression d’un référentiel supprime toutes les images qu’il contient, ainsi que leurs balises, calques propres et manifestes. Lorsque vous supprimez un référentiel, vous récupérez l’espace de stockage utilisé par les images qui font référence à des calques uniques qui s’y trouvaient.

La commande suivante d’Azure CLI supprime le référentiel « acr-helloworld », ainsi que toutes les étiquettes et tous les manifestes. Si les calques référencés par les manifestes supprimés ne sont pas référencés par d’autres images du registre, les données de calques sont elles aussi supprimées, permettant ainsi de récupérer de l’espace de stockage.

 az acr repository delete --name myregistry --repository acr-helloworld

Supprimer en fonction de l’étiquette

Vous pouvez supprimer des images d’un référentiel en spécifiant le nom du référentiel et l’étiquette dans l’opération de suppression. Lorsque vous supprimez une étiquette, vous récupérez l’espace de stockage utilisé par les calques propres à l’image (c’est-à-dire les calques qui ne sont partagés par aucune autre image du registre).

Pour supprimer l’étiquette, utilisez az acr repository delete et spécifiez le nom de l’image dans le paramètre --image. Tous les calques propres à l’image, et toutes les autres étiquettes associées à l’image, sont supprimés.

Voici un exemple de suppression de l’image « acr-helloworld:latest » dans le registre « myregistry » :

az acr repository delete --name myregistry --image acr-helloworld:latest
This operation will delete the manifest 'sha256:0a2e01852872580b2c2fea9380ff8d7b637d3928783c55beb3f21a6e58d5d108' and all the following images: 'acr-helloworld:latest', 'acr-helloworld:v3'.
Are you sure you want to continue? (y/n):

Conseil

La suppression en fonction de l’étiquette ne doit pas être confondue avec la suppression d’une étiquette. Vous pouvez supprimer une étiquette avec la commande az acr repository untag d’Azure CLI. Aucun espace n'est libéré lorsque vous supprimez l'étiquette d'une image, car son manifeste et ses données de calque sont conservés dans le registre. Seule la référence de l’étiquette est supprimée.

Supprimer en fonction du code de hachage du manifeste

Un code de hachage de manifeste peut être associé à une ou plusieurs étiquettes, ou à aucune. Lorsque vous supprimez en fonction du code de hachage, toutes les étiquettes référencées par le manifeste sont supprimées, comme le sont les données des calques propres à l’image. Les données de calques partagées ne sont pas supprimées.

Pour supprimer en fonction du code de hachage, commencez par répertorier les codes de hachage de manifeste du référentiel qui contient les images que vous souhaitez supprimer. Exemple :

az acr manifest list-metadata --name acr-helloworld --registry myregistry
[
  {
    "digest": "sha256:0a2e01852872580b2c2fea9380ff8d7b637d3928783c55beb3f21a6e58d5d108",
    "tags": [
      "latest",
      "v3"
    ],
    "timestamp": "2018-07-12T15:52:00.2075864Z"
  },
  {
    "digest": "sha256:3168a21b98836dda7eb7a846b3d735286e09a32b0aa2401773da518e7eba3b57",
    "tags": [
      "v2"
    ],
    "timestamp": "2018-07-12T15:50:53.5372468Z"
  }
]

Ensuite, spécifiez le code de hachage que vous souhaitez supprimer dans la commande az acr repository delete. Le format de la commande est le suivant :

az acr repository delete --name <acrName> --image <repositoryName>@<digest>

Par exemple, pour supprimer le dernier manifeste répertorié dans la sortie précédente (avec l’étiquette « v2 ») :

az acr repository delete --name myregistry --image acr-helloworld@sha256:3168a21b98836dda7eb7a846b3d735286e09a32b0aa2401773da518e7eba3b57
This operation will delete the manifest 'sha256:3168a21b98836dda7eb7a846b3d735286e09a32b0aa2401773da518e7eba3b57' and all the following images: 'acr-helloworld:v2'.
Are you sure you want to continue? (y/n): 

L'image acr-helloworld:v2 est supprimée du registre, comme le sont les données de calques propres à cette image. Si un manifeste est associé à plusieurs étiquettes, toutes les étiquettes associées sont également supprimées.

Supprimer des codes de hachage par timestamp

Pour limiter la taille d'un référentiel ou d'un registre, vous devrez peut-être périodiquement supprimer les codes de hachage de manifeste antérieurs à une certaine date.

La commande Azure CLI suivante répertorie tous les codes de hachage de manifeste d’un référentiel antérieurs à un timestamp spécifié, par ordre croissant. Remplacez <acrName> et <repositoryName> par les valeurs adaptées à votre environnement. Le timestamp peut être une expression date-heure complète ou une date, comme dans cet exemple.

az acr manifest list-metadata --name <repositoryName> --registry <acrName> \
    --orderby time_asc -o tsv --query "[?lastUpdateTime < '2019-04-05'].[digest, lastUpdateTime]"

Après avoir identifié les codes de hachage de manifeste obsolètes, vous pouvez exécuter le script Bash suivant pour supprimer les codes de hachage de manifeste antérieurs à un timestamp spécifié. Ce script nécessite Azure CLI et xargs. Par défaut, le script n’effectue aucune suppression. Remplacez la valeur ENABLE_DELETE par true pour activer la suppression des images.

Avertissement

Utilisez l'exemple de script suivant avec précaution : les données d'image supprimées ne sont PAS RÉCUPÉRABLES. Si vous disposez de systèmes qui tirent (pull) les images en fonction du code de hachage du manifeste (et non en fonction du nom de l'image), vous ne devez pas exécuter ces scripts. La suppression des codes de hachage de manifeste empêchera ces systèmes de tirer (pull) les images à partir du registre. Au lieu de tirer en fonction du manifeste, envisagez d’adopter un schéma d’étiquetage unique (il s’agit là d’une bonne pratique).

#!/bin/bash

# WARNING! This script deletes data!
# Run only if you do not have systems
# that pull images via manifest digest.

# Change to 'true' to enable image delete
ENABLE_DELETE=false

# Modify for your environment
# TIMESTAMP can be a date-time string such as 2019-03-15T17:55:00.
REGISTRY=myregistry
REPOSITORY=myrepository
TIMESTAMP=2019-04-05  

# Delete all images older than specified timestamp.

if [ "$ENABLE_DELETE" = true ]
then
    az acr manifest list-metadata --name $REPOSITORY --registry $REGISTRY \
    --orderby time_asc --query "[?lastUpdateTime < '$TIMESTAMP'].digest" -o tsv \
    | xargs -I% az acr repository delete --name $REGISTRY --image $REPOSITORY@% --yes
else
    echo "No data deleted."
    echo "Set ENABLE_DELETE=true to enable deletion of these images in $REPOSITORY:"
    az acr manifest list-metadata --name $REPOSITORY --registry $REGISTRY \
   --orderby time_asc --query "[?lastUpdateTime < '$TIMESTAMP'].[digest, lastUpdateTime]" -o tsv
fi

Supprimer les images sans étiquette

Comme mentionné dans la section Code de hachage de manifeste, l’envoi (push) d’une image modifiée à l’aide d’une étiquette existante entraîne la suppression de l’étiquette de l’image précédemment envoyée, ce qui a pour résultat une image orpheline (ou « non résolue »). L’image du manifeste précédemment envoyée (et ses données de calque) est conservée dans le registre. Regardez la séquence d’événements suivante :

  1. Envoyer (push) l’image acr-helloworld avec l’étiquette latest : docker push myregistry.azurecr.io/acr-helloworld:latest

  2. Vérifier les manifestes du référentiel acr-helloworld :

    az acr manifest list-metadata --name acr-helloworld --registry myregistry
    
    
    [
      {
        "digest": "sha256:d2bdc0c22d78cde155f53b4092111d7e13fe28ebf87a945f94b19c248000ceec",
        "tags": [
          "latest"
        ],
        "timestamp": "2018-07-11T21:32:21.1400513Z"
      }
    ]
    
  3. Modifier le Dockerfile de acr-helloworld

  4. Envoyer (push) l’image acr-helloworld avec l’étiquette latest : docker push myregistry.azurecr.io/acr-helloworld:latest

  5. Vérifier les manifestes du référentiel acr-helloworld :

    az acr manifest list-metadata --name acr-helloworld --registry myregistry
    
    [
      {
     "architecture": "amd64",
     "changeableAttributes": {
       "deleteEnabled": true,
       "listEnabled": true,
       "quarantineDetails": "{\"state\":\"Scan Passed\",\"link\":\"https://aka.ms/test\",\"scanner\":\"Azure Security Monitoring-Qualys Scanner\",\"result\":{\"version\":\"2020-05-13T00:23:31.954Z\",\"summary\":[{\"severity\":\"High\",\"count\":2},{\"severity\":\"Medium\",\"count\":0},{\"severity\":\"Low\",\"count\":0}]}}",
       "quarantineState": "Passed",
       "readEnabled": true,
       "writeEnabled": true
     },
     "configMediaType": "application/vnd.docker.container.image.v1+json",
     "createdTime": "2020-05-16T04:25:14.3112885Z",
     "digest": "sha256:eef2ef471f9f9d01fd2ed81bd2492ddcbc0f281b0a6e4edb700fbf9025448388",
     "imageSize": 22906605,
     "lastUpdateTime": "2020-05-16T04:25:14.3112885Z",
     "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
     "os": "linux",
     "timestamp": "2020-05-16T04:25:14.3112885Z"
      }
    ]
    

Le tableau d’étiquettes est supprimé des métadonnées lorsqu’une image n’est pas étiquetée. Ce manifeste se trouve toujours dans le registre, ainsi que toutes les données des calques propres qu’il référence. Pour supprimer ces images orphelines et leurs données de calque, vous devez supprimer en fonction du code de hachage du manifeste.

Vider automatiquement les balises et les manifestes

Azure Container Registry fournit les méthodes automatisées suivantes pour supprimer les balises et les manifestes, ainsi que les données de couche uniques qui leur sont associées :

  • Créez une tâche ACR qui exécute la commande de conteneur acr purge pour supprimer toutes les balises ayant dépassé une certaine durée ou correspondant à un filtre de nom spécifié. Éventuellement, configurez acr purge pour supprimer les manifestes sans balise.

    La commande de conteneur acr purge est actuellement en préversion. Pour plus d’informations, consultez Purger automatiquement les images d’un registre de conteneurs Azure.

  • Vous pouvez éventuellement définir une stratégie de rétention pour chaque registre, afin de gérer les manifestes sans balise. Lorsque vous activez une stratégie de rétention, les fichiers manifestes d’image du registre qui n’ont aucune balise associée, ainsi que les données sous-jacentes, sont automatiquement supprimés après une période définie.

    La stratégie de conservation est actuellement une fonctionnalité d’évaluation des registres de conteneurs Premium. La stratégie de rétention s’applique uniquement aux manifestes sans balise créés après la prise d’effet de la stratégie.

Étapes suivantes

Pour plus d’informations sur le stockage des images dans Azure Container Registry, consultez Stockage des images conteneur dans Azure Container Registry.