Condividi tramite


Eliminare le immagini del contenitore in Registro Azure Container

Per mantenere le dimensioni del Registro Azure Container, è consigliabile eliminare periodicamente i dati di immagini non aggiornati. Alcune immagini di contenitori distribuite in produzione potrebbero richiedere un'archiviazione a lungo termine, mentre altre possono solitamente essere eliminate prima. Ad esempio, in uno scenario di compilazione e test automatici, il registro può riempirsi velocemente di immagini che non verranno mai distribuite, pertanto potrà essere svuotato subito dopo aver compilato la build ed effettuato correttamente i test.

Poiché è possibile eliminare i dati di immagini in modi diversi, è importante comprendere l'impatto di ciascun tipo di eliminazione sull'utilizzo dello spazio di archiviazione. Questo articolo illustra diversi metodi per eliminare i dati immagine:

  • Eliminare un repository: elimina tutte le immagini e tutti i livelli univoci all'interno del repository.
  • Eliminare in base ai tag: elimina un'immagine, il tag, tutti i livelli univoci a cui l'immagine fa riferimento e tutti gli altri tag a essa associati.
  • Eliminare in base all'hash di manifesto: elimina un'immagine, tutti i livelli univoci a cui fa riferimento l'immagine e tutti i tag a essa associati.

Per un'introduzione a questi concetti, vedere Informazioni su registri, repository e immagini.

Nota

Dopo aver eliminato i dati dell'immagine, Registro Azure Container interrompe immediatamente la fatturazione per l'archiviazione associata. Tuttavia, il Registro di sistema recupera lo spazio di archiviazione associato usando un processo asincrono. L'operazione richiede tempo prima che il Registro di sistema pulisca i livelli e mostri l'utilizzo aggiornato dell'archiviazione.

Eliminare un repository

L'eliminazione di un repository elimina anche tutte le immagini al suo interno, inclusi tag, livelli univoci e manifesti. Quando si elimina un repository, si recupera lo spazio di archiviazione usato dalle immagini che fanno riferimento a livelli univoci nel repository.

Il comando seguente dell'interfaccia della riga di comando di Azure elimina il repository "acr-helloworld" e tutti i tag e i manifesti al suo interno. Se ai livelli a cui fanno riferimento i manifesti eliminati non viene fatto riferimento da altre immagini nel Registro di sistema, vengono eliminati anche i dati del livello, recuperando lo spazio di archiviazione.

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

Eliminare in base ai tag

È possibile eliminare immagini singole da un repository specificando il nome del repository e il tag nell'operazione di eliminazione. Quando si elimina in base ai tag, si recupera lo spazio di archiviazione usato dai livelli univoci dell'immagine, ossia quelli non condivisi da altre immagini nel registro.

Per eliminare in base ai tag, usare il comando az acr repository delete e specificare il nome dell'immagine nel parametro --image. Vengono eliminati tutti i livelli univoci dell'immagine e gli altri tag a essa associati.

Ad esempio, questa è l'eliminazione dell'immagine "acr-helloworld:latest" dal registro "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):

Suggerimento

L'eliminazione in base ai tag non deve essere confuso con l'eliminazione (rimozione) di un tag. È possibile eliminare un tag con il comando dell'interfaccia della riga di comando di Azure az acr repository untag. Quandi si rimuove un tag da un'immagine, non si recupera spazio in quanto il relativo manifesto e i dati dei livelli rimangono nel registro. Viene eliminato solo il riferimento al tag.

Eliminare in base all'hash di manifesto

È possibile associare un hash di manifesto a uno o più tag oppure a nessuno. Quando si elimina in base all'hash, vengono eliminati tutti i tag a cui fa riferimento il manifesto, così come i dati dei livelli univoci dell'immagine. I dati dei livelli condivisi non vengono eliminati.

Per eliminare in base all'hash, elencare prima gli hash di manifesto nel repository che contengono le immagini da eliminare. Ad esempio:

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

Specificare quindi l'hash da eliminare nel comando az acr repository delete. Il formato del comando è:

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

Ad esempio, per eliminare l'ultimo manifesto elencato nell'output precedente (con il 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): 

L'immagine acr-helloworld:v2 viene eliminata dal registro, così come i dati dei suoi livelli univoci. Se un manifesto è associato a più tag, vengono eliminati anche tutti i tag associati.

Eliminare i digest in base al timestamp

Per mantenere le dimensioni di un repository o di un registro, potrebbe essere necessario eliminare periodicamente i digest del manifesto precedenti a una determinata data.

Il comando seguente dell'interfaccia della riga di comando di Azure elenca tutti i digest del manifesto in un repository precedente a un timestamp specificato, in ordine crescente. Sostituire <acrName> e <repositoryName> con i valori appropriati all'ambiente. Il timestamp può essere un'espressione data/ora completa o una data, come in questo esempio.

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

Dopo aver identificato i digest del manifesto non aggiornati, è possibile eseguire lo script Bash seguente per eliminare i digest del manifesto precedenti a un timestamp specificato. e richiede l'interfaccia della riga di comando di Azure e xargs. Per impostazione predefinita, lo script non esegue alcuna operazione di eliminazione. Modificare il valore ENABLE_DELETE in true per abilitare l'eliminazione delle immagini.

Avviso

Usare lo script di esempio seguente con cautela: i dati di un'immagine eliminata NON POSSONO ESSERE RIPRISTINATI. Se si dispone di sistemi che eseguono il pull delle immagini tramite hash di manifesto e non tramite i nomi, non eseguire questi script. L'eliminazione dei digest del manifesto impedirà a tali sistemi di eseguire il pull delle immagini dal registro. Invece di eseguire il pull tramite manifesto, adottare uno schema di assegnazione di tag univoci, una procedura consigliata.

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

Eliminare le immagini senza tag

Come accennato nella sezione Hash di manifesto, il push di un'immagine modificata con un tag esistente rimuove i tag dell'immagine del push precedente, dando vita a un'immagine orfana. Il manifesto dell'immagine del push precedente, così come i dati dei relativi livelli, rimane nel registro. Considerare la sequenza di eventi seguente:

  1. Eseguire il push dell'immagine acr-helloworld con il tag latest: docker push myregistry.azurecr.io/acr-helloworld:latest

  2. Controllare i manifesti per il 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. Modificare il Dockerfile acr-helloworld

  4. Eseguire il push dell'immagine acr-helloworld con il tag latest: docker push myregistry.azurecr.io/acr-helloworld:latest

  5. Controllare i manifesti per il 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"
      }
    ]
    

La matrice di tag viene rimossa dai metadati quando un'immagine non è contrassegnata. Questo manifesto è ancora presente nel registro, insieme a tutti i dati dei livelli univoci a cui fa riferimento. Per eliminare le immagini orfane e i relativi dati di livelli, è necessario eliminarle tramite l'hash di manifesto.

Ripulire automaticamente tag e manifesti

Registro Azure Container offre i metodi automatizzati seguenti per rimuovere tag e manifesti e i relativi dati di livello univoci associati:

  • Creare un'attività del Registro Azure Container che esegue il comando contenitore acr purge per eliminare tutti i tag precedenti a una determinata durata o che corrispondono a un filtro del nome specificato. Facoltativamente, configurare acr purge per eliminare manifesti senza tag.

    Il comando contenitore acr purge è attualmente in anteprima. Per altre informazioni, vedere Eliminare automaticamente le immagini da un Registro Azure Container.

  • Facoltativamente, impostare un criterio di conservazione per ogni registro per gestire i manifesti senza tag. Quando si abilita un criterio di conservazione, i manifesti delle immagini nel Registro di sistema che non hanno tag associati e i dati del livello sottostanti vengono eliminati automaticamente dopo un periodo impostato.

    I criteri di conservazione sono attualmente una funzionalità di anteprima dei registri contenitori Premium. I criteri di conservazione si applicano solo ai manifesti senza tag creati dopo l'applicazione del criterio.

Passaggi successivi

Per altre informazioni sull'archiviazione delle immagini in Registro Azure Container, vedere Archiviazione di immagini del contenitore in Registro Azure Container.