Eliminare immagini del contenitore in Azure Container Registry usando l'interfaccia della riga di comando di AzureDelete container images in Azure Container Registry using the Azure CLI

Per mantenere le dimensioni del Registro Azure Container, è consigliabile eliminare periodicamente i dati di immagini non aggiornati.To maintain the size of your Azure container registry, you should periodically delete stale image data. Alcune immagini di contenitori distribuite in produzione potrebbero richiedere un'archiviazione a lungo termine, mentre altre possono solitamente essere eliminate prima.While some container images deployed into production may require longer-term storage, others can typically be deleted more quickly. 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.For example, in an automated build and test scenario, your registry can quickly fill with images that might never be deployed, and can be purged shortly after completing the build and test pass.

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.Because you can delete image data in several different ways, it's important to understand how each delete operation affects storage usage. Questo articolo illustra diversi metodi per l'eliminazione dei dati immagine:This article covers several methods for deleting image data:

  • Eliminare un repository: elimina tutte le immagini e tutti i livelli univoci all'interno del repository.Delete a repository: Deletes all images and all unique layers within the 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.Delete by tag: Deletes an image, the tag, all unique layers referenced by the image, and all other tags associated with the image.
  • 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.Delete by manifest digest: Deletes an image, all unique layers referenced by the image, and all tags associated with the image.

Sono disponibili script di esempio che consentono di automatizzare le operazioni di eliminazione.Sample scripts are provided to help automate delete operations.

Per un'introduzione a questi concetti, vedere informazioni su registri, repository e immagini.For an introduction to these concepts, see About registries, repositories, and images.

Eliminare un repositoryDelete repository

L'eliminazione di un repository elimina anche tutte le immagini al suo interno, inclusi tag, livelli univoci e manifesti.Deleting a repository deletes all of the images in the repository, including all tags, unique layers, and manifests. Quando si elimina un repository, si recupera lo spazio di archiviazione usato dalle immagini che fanno riferimento a livelli univoci nel repository.When you delete a repository, you recover the storage space used by the images that reference unique layers in that 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.The following Azure CLI command deletes the "acr-helloworld" repository and all tags and manifests within the repository. Se a livelli a cui fanno riferimento i manifesti eliminati non viene fatto riferimento da nessun'altra immagine nel registro di sistema, vengono eliminati anche i dati del livello e il recupero dello spazio di archiviazione.If layers referenced by the deleted manifests are not referenced by any other images in the registry, their layer data is also deleted, recovering the storage space.

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

Eliminare in base ai tagDelete by tag

È possibile eliminare immagini singole da un repository specificando il nome del repository e il tag nell'operazione di eliminazione.You can delete individual images from a repository by specifying the repository name and tag in the delete operation. 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.When you delete by tag, you recover the storage space used by any unique layers in the image (layers not shared by any other images in the registry).

Per eliminare il tag, usare AZ ACR repository Delete e specificare il nome dell'immagine nel parametro --image.To delete by tag, use az acr repository delete and specify the image name in the --image parameter. Vengono eliminati tutti i livelli univoci dell'immagine e gli altri tag a essa associati.All layers unique to the image, and any other tags associated with the image are deleted.

Ad esempio, questa è l'eliminazione dell'immagine "acr-helloworld:latest" dal registro "myregistry":For example, deleting the "acr-helloworld:latest" image from registry "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): y

Suggerimento

L'eliminazione in base ai tag non deve essere confuso con l'eliminazione (rimozione) di un tag.Deleting by tag shouldn't be confused with deleting a tag (untagging). È possibile eliminare un tag con il comando dell'interfaccia della riga di comando di Azure AZ ACR repository contrassegno.You can delete a tag with the Azure CLI command az acr repository untag. Quando si contrassegno un'immagine, non viene liberato alcuno spazio perché il manifesto e i dati del livello rimangono nel registro di sistema.No space is freed when you untag an image because its manifest and layer data remain in the registry. Viene eliminato solo il riferimento al tag.Only the tag reference itself is deleted.

Eliminare in base all'hash di manifestoDelete by manifest digest

È possibile associare un hash di manifesto a uno o più tag oppure a nessuno.A manifest digest can be associated with one, none, or multiple tags. 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.When you delete by digest, all tags referenced by the manifest are deleted, as is layer data for any layers unique to the image. I dati dei livelli condivisi non vengono eliminati.Shared layer data is not deleted.

Per eliminare in base all'hash, elencare prima gli hash di manifesto nel repository che contengono le immagini da eliminare.To delete by digest, first list the manifest digests for the repository containing the images you wish to delete. Ad esempio:For example:

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

Specificare quindi il digest che si vuole eliminare nel comando AZ ACR repository Delete .Next, specify the digest you wish to delete in the az acr repository delete command. Il formato del comando è:The format of the command is:

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

Ad esempio, per eliminare l'ultimo manifesto elencato nell'output precedente (con il tag "v2"):For example, to delete the last manifest listed in the preceding output (with the 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): y

L'immagine acr-helloworld:v2 viene eliminata dal registro di sistema, così come tutti i dati di livello univoci di tale immagine.The acr-helloworld:v2 image is deleted from the registry, as is any layer data unique to that image. Se un manifesto è associato a più tag, vengono eliminati anche tutti i tag associati.If a manifest is associated with multiple tags, all associated tags are also deleted.

Elimina digest in base al timestampDelete digests by timestamp

Per mantenere le dimensioni di un repository o di un registro di sistema, potrebbe essere necessario eliminare periodicamente i digest del manifesto più vecchi di una determinata data.To maintain the size of a repository or registry, you might need to periodically delete manifest digests older than a certain date.

Il comando dell'interfaccia della riga di comando di Azure seguente elenca tutto il digest del manifesto in un repository precedente a un timestamp specificato, in ordine crescente.The following Azure CLI command lists all manifest digest in a repository older than a specified timestamp, in ascending order. Sostituire <acrName> e <repositoryName> con i valori appropriati all'ambiente.Replace <acrName> and <repositoryName> with values appropriate for your environment. Il timestamp potrebbe essere un'espressione di data e ora completa o una data, come in questo esempio.The timestamp could be a full date-time expression or a date, as in this example.

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

Dopo aver identificato i digest del manifesto obsoleti, è possibile eseguire lo script bash seguente per eliminare i digest del manifesto anteriori a un timestamp specificato.After identifying stale manifest digests, you can run the following Bash script to delete manifest digests older than a specified timestamp. e richiede l'interfaccia della riga di comando di Azure e xargs.It requires the Azure CLI and xargs. Per impostazione predefinita, lo script non esegue alcuna operazione di eliminazione.By default, the script performs no deletion. Modificare il valore ENABLE_DELETE in true per abilitare l'eliminazione delle immagini.Change the ENABLE_DELETE value to true to enable image deletion.

Avviso

Usare lo script di esempio seguente con cautela. i dati dell'immagine eliminati sono irreversibili.Use the following sample script with caution--deleted image data is UNRECOVERABLE. Se si dispone di sistemi che effettuano il pull di immagini dal digest del manifesto (in contrapposizione al nome dell'immagine), è consigliabile non eseguire questi script.If you have systems that pull images by manifest digest (as opposed to image name), you should not run these scripts. L'eliminazione dei digest del manifesto impedisce a tali sistemi di estrarre le immagini dal registro di sistema.Deleting the manifest digests will prevent those systems from pulling the images from your registry. Anziché estrarre il manifesto, è consigliabile adottare uno schema di tag univoco , una procedura consigliata.Instead of pulling by manifest, consider adopting a unique tagging scheme, a recommended best practice.

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

Eliminare le immagini senza tagDelete untagged images

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.As mentioned in the Manifest digest section, pushing a modified image using an existing tag untags the previously pushed image, resulting in an orphaned (or "dangling") image. Il manifesto dell'immagine del push precedente, così come i dati dei relativi livelli, rimane nel registro.The previously pushed image's manifest--and its layer data--remains in the registry. Considerare la sequenza di eventi seguente:Consider the following sequence of events:

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

  2. Controllare i manifesti per il repository acr-helloworld:Check manifests for repository 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. Modificare il Dockerfile acr-helloworldModify acr-helloworld Dockerfile

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

  5. Controllare i manifesti per il repository acr-helloworld:Check manifests for repository 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"
      }
    ]
    

Come si può notare nell'output dell'ultimo passaggio della sequenza, esiste ora un manifesto orfano il cui "tags" proprietà è un elenco vuoto.As you can see in the output of the last step in the sequence, there is now an orphaned manifest whose "tags" property is an empty list. Questo manifesto è ancora presente nel registro, insieme a tutti i dati dei livelli univoci a cui fa riferimento.This manifest still exists within the registry, along with any unique layer data that it references. Per eliminare le immagini orfane e i relativi dati di livelli, è necessario eliminarle tramite l'hash di manifesto.To delete such orphaned images and their layer data, you must delete by manifest digest.

Eliminare tutte le immagini senza tagDelete all untagged images

È possibile elencare tutte le immagini senza tag nel repository usando il comando seguente dell'interfaccia della riga di comando di Azure.You can list all untagged images in your repository using the following Azure CLI command. Sostituire <acrName> e <repositoryName> con i valori appropriati all'ambiente.Replace <acrName> and <repositoryName> with values appropriate for your environment.

az acr repository show-manifests --name <acrName> --repository <repositoryName> --query "[?tags[0]==null].digest"

Utilizzando questo comando in uno script, è possibile eliminare tutte le immagini senza tag in un repository.Using this command in a script, you can delete all untagged images in a repository.

Avviso

Usare lo script di esempio seguente con cautela: i dati di un'immagine eliminata NON POSSONO ESSERE RIPRISTINATI.Use the following sample scripts with caution--deleted image data is UNRECOVERABLE. Se si dispone di sistemi che effettuano il pull di immagini dal digest del manifesto (in contrapposizione al nome dell'immagine), è consigliabile non eseguire questi script.If you have systems that pull images by manifest digest (as opposed to image name), you should not run these scripts. L'eliminazione delle immagini senza tag impedirà a tali sistemi di eseguire il pull delle immagini dal registro.Deleting untagged images will prevent those systems from pulling the images from your registry. Anziché estrarre il manifesto, è consigliabile adottare uno schema di tag univoco , una procedura consigliata.Instead of pulling by manifest, consider adopting a unique tagging scheme, a recommended best practice.

Interfaccia della riga di comando di Azure in BashAzure CLI in Bash

Lo script Bash seguente elimina tutte le immagini senza tag da un repositoryThe following Bash script deletes all untagged images from a repository. e richiede l'interfaccia della riga di comando di Azure e xargs.It requires the Azure CLI and xargs. Per impostazione predefinita, lo script non esegue alcuna operazione di eliminazione.By default, the script performs no deletion. Modificare il valore ENABLE_DELETE in true per abilitare l'eliminazione delle immagini.Change the ENABLE_DELETE value to true to enable image deletion.

#!/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
REGISTRY=myregistry
REPOSITORY=myrepository

# Delete all untagged (orphaned) images
if [ "$ENABLE_DELETE" = true ]
then
    az acr repository show-manifests --name $REGISTRY --repository $REPOSITORY  --query "[?tags[0]==null].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 image deletion of these images in $REPOSITORY:"
    az acr repository show-manifests --name $REGISTRY --repository $REPOSITORY --query "[?tags[0]==null]" -o tsv
fi

Interfaccia della riga di comando di Azure in PowerShellAzure CLI in PowerShell

Lo script PowerShell seguente elimina tutte le immagini senza tag da un repositoryThe following PowerShell script deletes all untagged images from a repository. e richiede PowerShell e l'interfaccia della riga di comando di Azure.It requires PowerShell and the Azure CLI. Per impostazione predefinita, lo script non esegue alcuna operazione di eliminazione.By default, the script performs no deletion. Modificare il valore $enableDelete in $TRUE per abilitare l'eliminazione delle immagini.Change the $enableDelete value to $TRUE to enable image deletion.

# 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
$enableDelete = $FALSE

# Modify for your environment
$registry = "myregistry"
$repository = "myrepository"

if ($enableDelete) {
    az acr repository show-manifests --name $registry --repository $repository --query "[?tags[0]==null].digest" -o tsv `
    | %{ az acr repository delete --name $registry --image $repository@$_ --yes }
} else {
    Write-Host "No data deleted."
    Write-Host "Set `$enableDelete = `$TRUE to enable image deletion."
    az acr repository show-manifests --name $registry --repository $repository --query "[?tags[0]==null]" -o tsv
}

Ripulire automaticamente tag e manifesti (anteprima)Automatically purge tags and manifests (preview)

In alternativa alla creazione di script per i comandi dell'interfaccia della riga di comando di Azure, eseguire un'attività ACR su richiesta o pianificata per eliminare tutti i tag precedenti a una determinata durata o corrispondere a un filtro di nome specificato.As an alternative to scripting Azure CLI commands, run an on-demand or scheduled ACR task to delete all tags that are older than a certain duration or match a specified name filter. Per altre informazioni, vedere eliminare automaticamente le immagini da un registro contenitori di Azure.For more information, see Automatically purge images from an Azure container registry.

Impostare facoltativamente un criterio di conservazione per ogni registro di sistema, per gestire manifesti senza tag.Optionally set a retention policy for each registry, to manage untagged manifests. Quando si Abilita un criterio di conservazione, i manifesti di immagine nel registro di sistema che non dispongono di tag associati e i dati del livello sottostante vengono eliminati automaticamente dopo un periodo di tempo stabilito.When you enable a retention policy, image manifests in the registry that don't have any associated tags, and the underlying layer data, are automatically deleted after a set period.

Passaggi successiviNext steps

Per altre informazioni sull'archiviazione delle immagini in Registro Azure Container, vedere Archiviazione di immagini del contenitore in Registro Azure Container.For more information about image storage in Azure Container Registry see Container image storage in Azure Container Registry.