Eliminar imagens de contentor no Azure Container Registry

Para manter o tamanho do seu registo de contentor do Azure, deve eliminar periodicamente dados de imagem obsoletos. Embora algumas imagens de contentor implementadas em produção possam exigir armazenamento a longo prazo, outras podem normalmente ser eliminadas mais rapidamente. Por exemplo, num cenário automatizado de compilação e teste, o seu registo pode preencher rapidamente com imagens que podem nunca ser implementadas e pode ser removido pouco depois de concluir a compilação e o teste.

Uma vez que pode eliminar dados de imagens de várias formas diferentes, é importante compreender como cada operação de eliminação afeta a utilização do armazenamento. Este artigo abrange vários métodos para eliminar dados de imagem:

  • Eliminar um repositório: elimina todas as imagens e todas as camadas exclusivas no repositório.
  • Eliminar por etiqueta: elimina uma imagem, a etiqueta, todas as camadas exclusivas referenciadas pela imagem e todas as outras etiquetas associadas à imagem.
  • Eliminar por resumo do manifesto: elimina uma imagem, todas as camadas exclusivas referenciadas pela imagem e todas as etiquetas associadas à imagem.

Para obter uma introdução a estes conceitos, veja Acerca dos registos, repositórios e imagens.

Nota

Depois de eliminar os dados da imagem, Azure Container Registry deixa de faturar imediatamente para o armazenamento associado. No entanto, o registo recupera o espaço de armazenamento associado com um processo assíncrono. Demora algum tempo até que o registo limpe as camadas e mostre a utilização de armazenamento atualizada.

Eliminar repositório

Eliminar um repositório elimina todas as imagens no repositório, incluindo todas as etiquetas, camadas exclusivas e manifestos. Quando elimina um repositório, recupera o espaço de armazenamento utilizado pelas imagens que referenciam camadas exclusivas nesse repositório.

O seguinte comando da CLI do Azure elimina o repositório "acr-helloworld" e todas as etiquetas e manifestos no repositório. Se as camadas referenciadas pelos manifestos eliminados não forem referenciadas por outras imagens no registo, os respetivos dados de camada também são eliminados, recuperando o espaço de armazenamento.

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

Eliminar por etiqueta

Pode eliminar imagens individuais de um repositório ao especificar o nome e a etiqueta do repositório na operação de eliminação. Quando elimina por etiqueta, recupera o espaço de armazenamento utilizado por quaisquer camadas exclusivas na imagem (camadas não partilhadas por outras imagens no registo).

Para eliminar por etiqueta, utilize az acr repository delete e especifique o nome da imagem no --image parâmetro . Todas as camadas exclusivas da imagem e quaisquer outras etiquetas associadas à imagem são eliminadas.

Por exemplo, ao eliminar a imagem "acr-helloworld:latest" do registo "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):

Dica

A eliminação por etiqueta não deve ser confundida com a eliminação de uma etiqueta (desativação). Pode eliminar uma etiqueta com o comando da CLI do Azure az acr repository untag. Não é libertado espaço ao desmarcar uma imagem porque os respetivos dados de manifesto e camada permanecem no registo. Apenas a própria referência de etiqueta é eliminada.

Eliminar por resumo do manifesto

Um resumo do manifesto pode ser associado a uma, nenhuma ou várias etiquetas. Quando elimina por resumo, todas as etiquetas referenciadas pelo manifesto são eliminadas, tal como os dados de camada para quaisquer camadas exclusivas da imagem. Os dados de camada partilhada não são eliminados.

Para eliminar por resumo, liste primeiro os resumos do manifesto do repositório que contém as imagens que pretende eliminar. Por exemplo:

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

Em seguida, especifique o resumo que pretende eliminar no comando az acr repository delete . O formato do comando é:

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

Por exemplo, para eliminar o último manifesto listado no resultado anterior (com a 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): 

A acr-helloworld:v2 imagem é eliminada do registo, assim como quaisquer dados de camada exclusivos dessa imagem. Se um manifesto estiver associado a várias etiquetas, todas as etiquetas associadas também serão eliminadas.

Eliminar resumos por carimbo de data/hora

Para manter o tamanho de um repositório ou registo, poderá ter de eliminar periodicamente resumos de manifestos com mais de uma determinada data.

O seguinte comando da CLI do Azure lista todos os resumos de manifestos num repositório mais antigo do que um carimbo de data/hora especificado, por ordem ascendente. Substitua <acrName> e <repositoryName> pelos valores adequados para o seu ambiente. O carimbo de data/hora pode ser uma expressão de data/hora completa ou uma data, como neste exemplo.

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

Depois de identificar resumos de manifesto obsoletos, pode executar o seguinte script bash para eliminar resumos de manifestos mais antigos do que um carimbo de data/hora especificado. Requer a CLI do Azure e xargs. Por predefinição, o script não efetua nenhuma eliminação. Altere o ENABLE_DELETE valor para para true ativar a eliminação de imagens.

Aviso

Utilize o seguinte script de exemplo com dados de imagem eliminados por precaução irrecuperáveis. Se tiver sistemas que extraem imagens por resumo do manifesto (por oposição ao nome da imagem), não deve executar estes scripts. Eliminar os resumos do manifesto impedirá que esses sistemas extraiam as imagens do seu registo. Em vez de solicitar por manifesto, considere adotar um esquema de etiquetagem exclusivo , uma melhor prática recomendada.

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

Eliminar imagens não etiquetadas

Conforme mencionado na secção Resumo do manifesto , emitir uma imagem modificada com uma etiqueta existente desmarca a imagem anteriormente enviada, resultando numa imagem órfã (ou "pendente"). O manifesto da imagem anteriormente enviada e os respetivos dados de camada permanecem no registo. Considere a seguinte sequência de eventos:

  1. Envie acr-helloworld da imagem com a etiqueta mais recente: docker push myregistry.azurecr.io/acr-helloworld:latest

  2. Verifique os manifestos do repositório 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 o Dockerfile acr-helloworld

  4. Envie acr-helloworld da imagem com a etiqueta mais recente: docker push myregistry.azurecr.io/acr-helloworld:latest

  5. Verifique os manifestos do repositório 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"
      }
    ]
    

A matriz de etiquetas é removida dos metadados quando uma imagem não está ativada. Este manifesto ainda existe no registo, juntamente com quaisquer dados de camada exclusivos que referencie. Para eliminar essas imagens órfãs e os respetivos dados de camada, tem de eliminar por resumo do manifesto.

Remover automaticamente etiquetas e manifestos

Azure Container Registry fornece os seguintes métodos automatizados para remover etiquetas e manifestos e os respetivos dados de camada exclusivos associados:

  • Crie uma tarefa do ACR que execute o comando de acr purge contentor para eliminar todas as etiquetas com mais de uma determinada duração ou que correspondam a um filtro de nome especificado. Opcionalmente, configure acr purge para eliminar manifestos não marcados.

    O acr purge comando de contentor está atualmente em pré-visualização. Para obter mais informações, veja Remover automaticamente imagens de um registo de contentor do Azure.

  • Opcionalmente, defina uma política de retenção para cada registo, para gerir manifestos não marcados. Quando ativa uma política de retenção, os manifestos de imagem no registo que não têm etiquetas associadas e os dados de camada subjacentes são eliminados automaticamente após um período definido.

    A política de retenção é atualmente uma funcionalidade de pré-visualização dos registos de contentor Premium . A política de retenção aplica-se apenas a manifestos não marcados criados após a entrada em vigor da política.

Passos seguintes

Para obter mais informações sobre o armazenamento de imagens no Azure Container Registry, veja Container image storage in Azure Container Registry (Armazenamento de imagens de contentor no Azure Container Registry).