Ta bort containeravbildningar från Azure Container Registry

För att behålla storleken på ditt Azure-containerregister bör du regelbundet ta bort inaktuella avbildningsdata. Vissa containeravbildningar som distribueras till produktion kan kräva långsiktig lagring, men andra kan vanligtvis tas bort snabbare. I ett automatiserat bygg- och testscenario kan registret till exempel snabbt fyllas med avbildningar som kanske aldrig distribueras och kan rensas strax efter att bygg- och testkörningen har avslutats.

Eftersom du kan ta bort avbildningsdata på flera olika sätt är det viktigt att förstå hur varje borttagningsåtgärd påverkar lagringsanvändningen. Den här artikeln beskriver flera metoder för att ta bort bilddata:

  • Ta bort en lagringsplats:Tar bort alla avbildningar och alla unika lager på lagringsplatsen.
  • Ta bort eftertagg: Tar bort en avbildning, taggen, alla unika lager som avbildningen refererar till och alla andra taggar som är associerade med avbildningen.
  • Ta bort med manifestet digest:Tar bort en avbildning, alla unika lager som avbildningen refererar till och alla taggar som är associerade med avbildningen.

En introduktion till dessa begrepp finns i Om register, lagringsplatsen och avbildningar.

Anteckning

När du har tagit bort bilddata Azure Container Registry faktureringen till dig omedelbart för den associerade lagringen. Registret återställer dock det associerade lagringsutrymmet med hjälp av en asynkron process. Det tar lite tid innan registret rensar lager och visar den uppdaterade lagringsanvändningen.

Ta bort lagringsplats

Om du tar bort en lagringsplats tas alla avbildningar i lagringsplatsen bort, inklusive alla taggar, unika lager och manifest. När du tar bort en lagringsplats återställer du det lagringsutrymme som används av avbildningarna som refererar till unika lager på lagringsplatsen.

Följande Azure CLI-kommando tar bort lagringsplatsen "acr-helloworld" och alla taggar och manifest på lagringsplatsen. Om lager som refereras av de borttagna manifesten inte refereras till av andra avbildningar i registret tas även deras lagerdata bort, vilket återställer lagringsutrymmet.

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

Ta bort efter tagg

Du kan ta bort enskilda avbildningar från en lagringsplats genom att ange lagringsplatsens namn och tagg i borttagningsåtgärden. När du tar bort efter tagg återställer du lagringsutrymmet som används av unika lager i avbildningen (skikt som inte delas av andra avbildningar i registret).

Om du vill ta bort efter tagg använder du az acr repository delete och anger avbildningsnamnet i --image parametern . Alla lager som är unika för avbildningen och alla andra taggar som är associerade med avbildningen tas bort.

Ta till exempel bort avbildningen "acr-helloworld:latest" från registret "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):

Tips

Borttagning efter tagg ska inte förväxlas med att ta bort en tagg (avtaggning). Du kan ta bort en tagg med Azure CLI-kommandot az acr repository untag. Inget utrymme frigörs när du avtaggar en avbildning eftersom dess manifest- och lagerdata finns kvar i registret. Endast själva taggreferensen tas bort.

Ta bort efter sammanfattning av manifest

Manifestet kan associeras med en, ingen eller flera taggar. När du tar bort enligt sammanfattning tas alla taggar som manifestet refererar till bort, liksom lagerdata för alla lager som är unika för avbildningen. Delade lagerdata tas inte bort.

Om du vill ta bort efter sammanfattning listar du först manifestet med sammanfattningar för lagringsplatsen som innehåller de avbildningar som du vill ta bort. Exempel:

az acr repository show-manifests --name myregistry --repository acr-helloworld
[
  {
    "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"
  }
]

Ange sedan den sammanfattning som du vill ta bort i kommandot az acr repository delete. Formatet för kommandot är:

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

Om du till exempel vill ta bort det sista manifestet som visas i föregående utdata (med taggen "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): 

acr-helloworld:v2Avbildningen tas bort från registret, precis som alla lagerdata som är unika för avbildningen. Om ett manifest är associerat med flera taggar tas även alla associerade taggar bort.

Ta bort sammanfattningar efter tidsstämpel

Om du vill behålla storleken på en lagringsplats eller ett register kan du behöva ta bort manifestet som är äldre än ett visst datum med jämna mellanrum.

Följande Azure CLI-kommando visar en lista över alla manifest som sammanfattas i en lagringsplats som är äldre än en angiven tidsstämpel i stigande ordning. Ersätt <acrName> och med värden som är lämpliga för din <repositoryName> miljö. Tidsstämpeln kan vara ett fullständigt datum/tid-uttryck eller ett datum, som i det här exemplet.

az acr repository show-manifests --name <acrName> --repository <repositoryName> \
--orderby time_asc -o tsv --query "[?timestamp < '2019-04-05'].[digest, timestamp]"

När du har identifierat inaktuella manifestet kan du köra följande Bash-skript för att ta bort manifestet som är äldre än en angiven tidsstämpel. Det kräver Azure CLI och xargs. Som standard utför skriptet ingen borttagning. Ändra värdet ENABLE_DELETE till för att aktivera borttagning av true avbildning.

Varning

Använd följande exempelskript med försiktighet – borttagna bilddata kan inte återställas. Om du har system som hämtar avbildningar efter manifest (till skillnad från avbildningens namn) bör du inte köra dessa skript. Om du tar bort manifestet kan systemen inte hämta avbildningarna från registret. I stället för att hämta efter manifest bör du överväga att införa ett unikt taggningsschema, vilket är en rekommenderad metod.

#!/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 repository show-manifests --name $REGISTRY --repository $REPOSITORY \
    --orderby time_asc --query "[?timestamp < '$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 repository show-manifests --name $REGISTRY --repository $REPOSITORY \
   --orderby time_asc --query "[?timestamp < '$TIMESTAMP'].[digest, timestamp]" -o tsv
fi

Ta bort otaggade bilder

Som vi nämnde i avsnittet Manifest digest (Sammanfattning av manifest) tar push-push-push av en ändrad avbildning med hjälp av en befintlig tagg bort den tidigare push-avbildningen, vilket resulterar i en frånkopplad (eller "dinglande") avbildning. Manifestet för den tidigare push-push-avbildningen – och dess lagerdata – finns kvar i registret. Tänk på följande händelsesekvens:

  1. Push-avbildning acr-helloworld med taggen latest: docker push myregistry.azurecr.io/acr-helloworld:latest

  2. Kontrollera manifest för lagringsplatsen acr-helloworld:

    az acr repository show-manifests --name myregistry --repository acr-helloworld
    
    
    [
      {
        "digest": "sha256:d2bdc0c22d78cde155f53b4092111d7e13fe28ebf87a945f94b19c248000ceec",
        "tags": [
          "latest"
        ],
        "timestamp": "2018-07-11T21:32:21.1400513Z"
      }
    ]
    
  3. Ändra dockerfile för acr-helloworld

  4. Push-avbildning acr-helloworld med taggen latest: docker push myregistry.azurecr.io/acr-helloworld:latest

  5. Kontrollera manifest för lagringsplatsen acr-helloworld:

    az acr repository show-manifests --name myregistry --repository acr-helloworld
    
    [
      {
        "digest": "sha256:7ca0e0ae50c95155dbb0e380f37d7471e98d2232ed9e31eece9f9fb9078f2728",
        "tags": [
          "latest"
        ],
        "timestamp": "2018-07-11T21:38:35.9170967Z"
      },
      {
        "digest": "sha256:d2bdc0c22d78cde155f53b4092111d7e13fe28ebf87a945f94b19c248000ceec",
        "tags": [],
        "timestamp": "2018-07-11T21:32:21.1400513Z"
      }
    ]
    

Som du ser i utdata från det sista steget i sekvensen finns det nu ett överblivet manifest "tags" vars egenskap är en tom lista. Det här manifestet finns fortfarande i registret, tillsammans med alla unika lagerdata som det refererar till. Om du vill ta bort sådana överblivna avbildningar och deras lagerdata måste du ta bort med manifestet digest.

Rensa taggar och manifest automatiskt

Azure Container Registry innehåller följande automatiserade metoder för att ta bort taggar och manifest och deras associerade unika lagerdata:

  • Skapa en ACR-uppgift som kör containerkommandot för att ta bort alla taggar som är äldre än en acr purge viss varaktighet eller som matchar ett angivet namnfilter. Du kan också konfigurera acr purge för att ta bort otaggade manifest.

    acr purgeContainerkommandot är för närvarande i förhandsversion. Mer information finns i Rensa avbildningar automatiskt från ett Azure-containerregister.

  • Du kan också ange en bevarandeprincip för varje register för att hantera otaggade manifest. När du aktiverar en kvarhållningsprincip tas avbildningsmanifest i registret som inte har några associerade taggar och underliggande lagerdata bort automatiskt efter en viss period.

    Bevarandeprincipen är för närvarande en förhandsgranskningsfunktion i Premium-containerregister. Bevarandeprincipen gäller endast för otaggade manifest som skapats efter att principen har verkställts.

Nästa steg

Mer information om avbildningslagring i Azure Container Registry finns i Containeravbildningslagring i Azure Container Registry.