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 l'eliminazione dei dati dell'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 arresta immediatamente la fatturazione per l'archiviazione associata. Tuttavia, il Registro di sistema recupera lo spazio di archiviazione associato usando un processo asincrono. È necessario tempo prima che il Registro di sistema pulisca i livelli e mostra 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 i livelli a cui fa riferimento i manifesti eliminati non fanno riferimento ad altre immagini del 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. Non viene liberato spazio quando si annulla il tag di un'immagine perché i dati del manifesto e del livello rimangono nel Registro di sistema. 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 di sistema, come tutti i dati di livello univoci per tale immagine. Se un manifesto è associato a più tag, vengono eliminati anche tutti i tag associati.

Eliminare i digest per timestamp

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

Il comando dell'interfaccia della riga di comando di Azure seguente elenca tutti i digest 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 manifesto non aggiornati, è possibile eseguire lo script Bash seguente per eliminare i digest 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 dati di immagine eliminati con attenzione è UNRECOVERABLE. Se si dispone di sistemi che eseguono il pull di immagini in base al digest manifesto (anziché al nome dell'immagine), non è consigliabile eseguire questi script. L'eliminazione dei digest del manifesto impedisce a tali sistemi di eseguire il pull delle immagini dal Registro di sistema. Invece di eseguire il pull con il 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.

Eliminare automaticamente i tag e i manifesti

Registro Azure Container fornisce 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 acr purge comando contenitore per eliminare tutti i tag meno recenti di una determinata durata o corrispondere a un filtro di nome specificato. Facoltativamente configurare acr purge per eliminare manifesti non contrassegnati.

    Il acr purge comando contenitore è 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 di sistema per gestire i manifesti non contrassegnati. 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 di set.

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

Passaggi successivi

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