Eliminación de imágenes de contenedor en Azure Container Registry

Para mantener el tamaño del registro de contenedor de Azure, debe eliminar periódicamente los datos de imagen obsoletos. Aunque algunas imágenes de contenedor implementadas en producción pueden requerir un almacenamiento a largo plazo, otras normalmente se pueden eliminar antes. Por ejemplo, en un escenario de compilación y prueba automatizado, el registro se puede rellenar rápidamente con imágenes que es posible que nunca se implementen y se pueden purgar poco después de completar el paso de compilación y prueba.

Dado que puede eliminar datos de la imagen de varias maneras diferentes, es importante comprender cómo afecta cada operación de eliminación al uso del almacenamiento. En este artículo se tratan varios métodos para eliminar los datos de imagen:

  • Eliminar un repositorio: elimina todas las imágenes y todas las capas únicas dentro del repositorio.
  • Eliminar por etiqueta: elimina una imagen, la etiqueta, todas las capas únicas a las que hace referencia la imagen y todas las demás etiquetas asociadas con la imagen.
  • Eliminar por hash de manifiesto: elimina una imagen, todas las capas únicas a las que hace referencia la imagen y todas las etiquetas asociadas con la imagen.

Para una introducción a estos conceptos, consulte About registries, repositories, and images (Acerca de los registros, los repositorios y las imágenes).

Nota

Después de eliminar los datos de la imagen, Azure Container Registry deja de facturarle el almacenamiento asociado inmediatamente. Sin embargo, el registro recupera el espacio de almacenamiento asociado mediante un proceso asincrónico. Pasa un tiempo hasta que el registro limpiar las capas y muestra el uso del almacenamiento actualizado.

Eliminación de un repositorio

Al eliminar un repositorio se eliminan todas las imágenes del repositorio, incluidas todas las etiquetas, capas únicas y manifiestos. Cuando se elimina un repositorio, se recupera el espacio de almacenamiento utilizado por las imágenes que hacen referencia a capas únicas de ese repositorio.

El siguiente comando de la CLI de Azure elimina el repositorio "acr-helloworld" y todas las etiquetas y manifiestos dentro del repositorio. Si no se hace referencia a las capas a las que hacen referencia los manifiestos eliminados desde cualquier otra imagen del registro, también se eliminan los datos de la capa, recuperando el espacio de almacenamiento.

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

Eliminación por etiqueta

Puede eliminar imágenes individuales de un repositorio especificando el nombre del repositorio y la etiqueta en la operación de eliminación. Cuando se elimina por etiqueta, se recupera el espacio de almacenamiento utilizado por todas las capas únicas de la imagen (las capas no compartidas por cualquier otra imagen del registro).

Para eliminar por etiqueta, use az acr repository delete y especifique el nombre de la imagen en el parámetro --image. Se eliminan todas las capas únicas de la imagen y las demás etiquetas asociadas con la imagen.

Por ejemplo, para eliminar la imagen "acr-helloworld:latest" del 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):

Sugerencia

La eliminación por etiqueta no debe confundirse con la eliminación de una etiqueta (quitar etiqueta). Puede eliminar una etiqueta con el comando de la CLI de Azure az acr repository untag. No se libera espacio al quitar la etiqueta de una imagen porque su manifiesto y los datos de la capa permanecen en el registro. Solo se elimina la propia referencia de la etiqueta.

Eliminación por hash de manifiesto

Un hash de manifiesto se puede asociar con una, ninguna o varias etiquetas. Cuando se elimina por hash, se eliminan todas las etiquetas a las que hace referencia el manifiesto, así como los datos de capa de todas las capas únicas de la imagen. Los datos de las capas compartidas no se eliminan.

Para eliminar por hash, debe enumerar en primer lugar los hash de manifiesto del repositorio que contiene las imágenes que desea eliminar. Por ejemplo:

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

A continuación, especifique el hash que desea eliminar en el comando az acr repository delete. El formato del comando es:

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

Por ejemplo, para eliminar el último manifiesto enumerado en la salida anterior (con la etiqueta "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): 

La imagen acr-helloworld:v2 se elimina del registro, así como los datos de la capa únicos de esa imagen. Si un manifiesto está asociado a varias etiquetas, también se eliminan todas las etiquetas asociadas.

Eliminación de resúmenes por marca de tiempo

Para mantener el tamaño de un registro o un repositorio, puede que deba eliminar periódicamente los resúmenes de manifiesto anteriores a una fecha determinada.

El siguiente comando de la CLI de Azure enumera todos los códigos hash del manifiesto de un repositorio con una antigüedad superior a una marca de tiempo especificada, en orden ascendente. Reemplace <acrName> y <repositoryName> por los valores adecuados para su entorno. La marca de tiempo podría ser una expresión de fecha y hora completa o una fecha, como en este ejemplo.

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

Después de identificar los resúmenes de manifiesto obsoletos, puede ejecutar el siguiente script de Bash para eliminar los resúmenes de manifiesto anteriores a una marca de tiempo especificada. Requiere la CLI de Azure y xargs. De forma predeterminada, el script no realiza ninguna eliminación. Establezca el valor de ENABLE_DELETE en true para habilitar la eliminación de imágenes.

Advertencia

Use el siguiente script de ejemplo con precaución: los datos de las imágenes eliminadas son IRRECUPERABLES. Si tiene sistemas que extraen imágenes por resumen de manifiesto (en lugar de por el nombre de la imagen), no debe ejecutar estos scripts. La eliminación de los resúmenes de manifiesto impide que esos sistemas extraigan las imágenes del registro. En lugar de extraer por manifiesto, considere la posibilidad de adoptar un esquema de etiquetado único, un procedimiento recomendado.

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

Eliminación de imágenes sin etiqueta

Como se mencionó en la sección Hash de manifiesto, la inserción de una imagen modificada con una etiqueta existente quita las etiquetas de la imagen insertada previamente, lo que resulta en una imagen huérfana (o "pendiente"). El manifiesto de la imagen insertada previamente y los datos de la capa permanecen en el registro. Considere la siguiente secuencia de eventos:

  1. Insertar la imagen acr-helloworld con la etiqueta latest: docker push myregistry.azurecr.io/acr-helloworld:latest

  2. Comprobar los manifiestos del repositorio 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. Modificar el archivo de Docker acr-helloworld

  4. Insertar la imagen acr-helloworld con la etiqueta latest: docker push myregistry.azurecr.io/acr-helloworld:latest

  5. Comprobar los manifiestos del repositorio 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 matriz de etiquetas se quita de los metadatos cuando una imagen está sin etiquetar. Este manifiesto sigue existiendo en el registro, junto con los datos de cualquier capa única a la que haga referencia. Para eliminar estas imágenes huérfanas y sus datos de capa, debe eliminar por hash del manifiesto.

Purga automática de etiquetas y manifiestos

Azure Container Registry proporciona los siguientes métodos automatizados para quitar etiquetas y manifiestos, así como los datos de sus capas únicos asociados:

  • Cree una tarea de ACR que ejecute el comando de contenedor acr purge para eliminar todas las etiquetas con una antigüedad superior a una duración determinada o que coincidan con un filtro de nombre especificado. Opcionalmente, configure acr purge para eliminar los manifiestos sin etiquetar.

    El comando de contenedor acr purge está actualmente en versión preliminar. Para más información, consulte Automatically purge images from an Azure Container Registry (Purga automática de imágenes a partir de una instancia de Azure Container Registry).

  • Opcionalmente, establezca una directiva de retención para cada registro con el fin de administrar los manifiestos sin etiquetar. Cuando se habilita una directiva de retención, los manifiestos de imagen del registro que no tienen etiquetas asociadas, y los datos de la capa subyacentes, se eliminan automáticamente después de un período establecido.

    Actualmente, la directiva de retención es una característica en vista previa (GB) de los registros de contenedor Prémium. La directiva de retención solo se aplica a los manifiestos sin etiquetar creados una vez que la directiva entra en vigor.

Pasos siguientes

Para más información sobre el almacenamiento de imágenes en Azure Container Registry, consulte Almacenamiento de imágenes de contenedor en Azure Container Registry.