Löschen von Containerimages in Azure Container Registry

Damit Ihre Azure-Containerregistrierung nicht zu groß wird, sollten Sie regelmäßig veraltete Imagedaten löschen. Während einige Containerimages, die in der Produktion bereitgestellt werden, eine längerfristige Speicherung erfordern, können andere in der Regel schneller gelöscht werden. In einem automatisierten Build- und Testszenario kann sich Ihre Registrierung beispielsweise schnell mit Images füllen, die möglicherweise nie bereitgestellt werden und kurz nach Abschluss der Build- und Test-Phase gelöscht werden können.

Da Sie Imagedaten auf verschiedenen Wegen löschen können, müssen Sie wissen, wie sich jeder Löschvorgang auf die Speicherauslastung auswirkt. In diesem Artikel werden verschiedene Methoden zum Löschen von Imagedaten behandelt:

  • Löschen eines Repositorys: Löscht alle Images und alle eindeutigen Ebenen innerhalb des Repositorys.
  • Löschen nach Tag: Löscht ein Image, das Tag, alle eindeutigen Ebenen, die auf das Image verweisen, und alle anderen Tags, die dem Image zugeordnet sind.
  • Löschen nach Manifest-Digest: Löscht ein Image, alle eindeutigen Ebenen, die auf das Image verweisen, und alle Tags, die dem Image zugeordnet sind.

Eine Einführung zu diesen Konzepten finden Sie unter Informationen zu Registrierungen, Repositorys und Images.

Hinweis

Nachdem Sie Imagedaten gelöscht haben, stellt Azure Container Registry die Abrechnung für den zugeordneten Speicher sofort ein. Allerdings stellt die Registrierung den zugeordneten Speicherplatz mithilfe eines asynchronen Prozesses wieder her. Es dauert einige Zeit, bis die Registrierung Ebenen bereinigt und die aktualisierte Speichernutzung widerspiegelt.

Löschen des Repositorys

Beim Löschen eines Repositorys werden alle Images im Repository einschließlich aller Tags, eindeutigen Ebenen und Manifeste gelöscht. Wenn Sie ein Repository löschen, stellen Sie den von in diesem Repository auf eindeutige Ebenen verweisende Images belegten Speicherplatz wieder her.

Der folgende Azure CLI-Befehl löscht das Repository „acr-helloworld“ und alle Tags und Manifeste innerhalb des Repositorys. Wenn auf die Ebenen, auf die die gelöschten Manifeste verweisen, nicht von anderen Images in der Registrierung verwiesen wird, werden deren Ebenendaten ebenfalls gelöscht, um den Speicherplatz wiederherzustellen.

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

Löschen nach Tag

Sie können einzelne Bilder aus einem Repository löschen, indem Sie den Namen und das Tag des Repositorys im Löschvorgang angeben. Wenn Sie nach Tag löschen, stellen Sie den Speicherplatz wieder her, der durch eindeutige Ebenen im Image (Ebenen, die nicht von anderen Images in der Registrierung freigegeben wurden) belegt war.

Verwenden Sie zum Löschen nach Tag az acr repository delete, und legen Sie den Imagenamen im Parameter --image fest. Alle eindeutigen Ebenen des Images und alle zugehörigen Tags werden gelöscht.

Beispiel: Löschen des Images „acr-helloworld:latest“ aus der Registrierung „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):

Tipp

Das Löschen nach Tag darf nicht mit dem Löschen (Aufheben) eines Tags verwechselt werden. Sie können ein Tag mit dem Azure CLI-Befehl az acr repository untag löschen. Beim Aufheben von Tags wird kein Speicherplatz freigegeben, da die zugehörigen Manifest- und Ebenendaten in der Registrierung verbleiben. Nur der Tag-Verweis wird gelöscht.

Löschen nach Manifest-Digest

Ein Manifest Digest kann einem, aber nicht mehrere Tags zugeordnet werden. Beim Löschen nach Digest werden alle vom Manifest zugeordneten Tags gelöscht, da Ebenendaten für alle Ebenen für das Bild eindeutig sind. Freigegebene Ebenendaten werden nicht gelöscht.

Zum Löschen nach Digest listen Sie zuerst die Manifest-Digests für das Repository mit den zu löschenden Bildern auf. Beispiel:

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"
  }
]

Legen Sie als Nächstes den zu löschenden Digest im Befehl az acr repository delete fest. Das Format des Befehls lautet:

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

So löschen Sie beispielsweise das letzte Manifest, das in der vorherigen Ausgabe (mit dem Tag „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): 

Das Image acr-helloworld:v2 und alle eindeutigen Ebenendaten dieses Images werden aus der Registrierung gelöscht. Wenn ein Manifest mehreren Tags zugeordnet ist, werden alle zugeordneten Tags ebenfalls gelöscht.

Löschen von Hashes nach Zeitstempel

Zum Verwalten der Größe eines Repositorys oder der Registrierung müssen Sie ggf. in regelmäßigen Abständen Manifesthashes löschen, die älter sind als ein bestimmtes Datum.

Der folgende Azure CLI-Befehl listet alle Manifesthashes in einem Repository, die älter als ein angegebener Zeitstempel sind, in aufsteigender Reihenfolge auf. Ersetzen Sie <acrName> und <repositoryName> durch entsprechende Werte für Ihre Umgebung. Bei dem Zeitstempel kann es sich um einen vollständigen Datums-/Uhrzeitausdruck oder wie im folgenden Beispiel um ein Datum handeln.

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

Nachdem Sie die veralteten Manifesthashes identifiziert haben, können Sie das folgende Bash-Skript ausführen, um Manifesthashes zu löschen, die älter als ein angegebener Zeitstempel sind. Dieses Skript erfordert die Azure CLI und xargs. Standardmäßig führt das Skript nicht keine Löschen aus. Ändern Sie den ENABLE_DELETE-Wert in true, um das Löschen von Images zu gestatten.

Warnung

Verwenden Sie die folgenden Beispielskripts mit Vorsicht: Gelöschte Imagedaten sind NICHT WIEDERHERSTELLBAR. Wenn Sie Systeme haben, die Images nach dem Manifesthash pullen (und nicht nach dem Imagenamen), sollten Sie diese Skripts nicht ausführen. Wenn Sie Manifesthashes löschen, können diese Systeme die Images nicht aus Ihrer Registrierung pullen. Erwägen Sie statt des Pullens nach Manifest die Einführung eines eindeutigen Tagging-Schemas. Dies ist eine bewährte Methode.

#!/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

Löschen von Images ohne Tags

Wie im Abschnitt Manifest-Digest werden beim Pushen eines veränderten Images mit vorhandenen Tags die Tags des zuvor per Push übertragenen Images aufgehoben. Die Folge ist ein verwaistes Image. Das Manifest des zuvor per Push übertragenen Images und dessen Ebenendaten verbleiben in der Registrierung. Gehen Sie dabei vom folgenden Ereignisablauf aus:

  1. Pushen Sie das Image acr-helloworld mit dem Tag latest (neueste):docker push myregistry.azurecr.io/acr-helloworld:latest

  2. Überprüfen Sie die Manifeste für das Repository 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. Verändern der Dockerfile acr-helloworld

  4. Pushen Sie das Image acr-helloworld mit dem Tag latest (neueste):docker push myregistry.azurecr.io/acr-helloworld:latest

  5. Überprüfen Sie die Manifeste für das Repository 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"
      }
    ]
    

Das Array „Tags“ wird aus Metadaten entfernt, wenn ein Image nicht getagt ist. Dieses Manifest ist weiterhin in der Registrierung vorhanden, zusammen mit eindeutigen Datenebenen, auf die es verweist. Um solche verwaisten Images und die zugehörigen Ebenendaten zu löschen, müssen Sie nach Manifest-Digest löschen.

Automatisches Löschen von Tags und Manifesten

Azure Container Registry stellt die folgenden automatisierten Methoden zum Entfernen von Tags und Manifesten sowie deren zugehöriger eindeutiger Ebenendaten zur Auswahl:

  • Erstellen einer ACR-Aufgabe, die den Containerbefehl acr purge zum Löschen aller Tags ausführt, die älter als eine bestimmte Dauer sind oder mit einem angegebenen Namensfilter übereinstimmen. Optionales Konfigurieren von acr purge, um nicht markierte Manifeste zu löschen.

    Der Containerbefehl acr purge befindet sich derzeit in der Vorschau. Weitere Informationen finden Sie unter Automatisches Löschen von Images aus einer Azure-Containerregistrierung.

  • Legen Sie optional eine Aufbewahrungsrichtlinie für jede Registrierung fest, um Manifeste ohne Markierungen zu verwalten. Wenn Sie eine Aufbewahrungsrichtlinie aktivieren, werden Imagemanifeste in der Registrierung ohne zugeordnete Markierungen sowie die zugrunde liegenden Ebenendaten nach einem festgelegten Zeitraum automatisch gelöscht.

    Die Aufbewahrungsrichtlinie derzeit eine Previewfunktion von Premium Container Registrys. Die Aufbewahrungsrichtlinie gilt nur für nicht markierte Manifeste, die nach dem Wirksamwerden der Richtlinie erstellt werden.

Nächste Schritte

Weitere Informationen zum Imagespeicher in Azure Container Registry finden Sie unter Containerimagespeicher in Azure Container Registry.