Excluir imagens de contêiner no Registro de Contêiner do Azure

Para manter o tamanho do registro do contêiner do Azure, exclua periodicamente os dados da imagem obsoletos. Embora algumas imagens de contêiner implantadas na produção possam exigir armazenamento de longo prazo, outras normalmente podem ser excluídas mais rapidamente. Por exemplo, em um cenário de criação e teste automatizado, o registro pode ser preenchido rapidamente com imagens que talvez nunca sejam implementadas e podem ser eliminadas logo após a conclusão da passagem de teste e de compilação.

Como você pode excluir dados de imagem de várias maneiras diferentes, é importante entender como cada operação de exclusão afeta o uso do armazenamento. Este artigo abordará vários métodos usados para excluir dados de imagem:

  • Exclua um repositório: Exclui todas as imagens e todas as camadas exclusivas do repositório.
  • Excluir pela tag: exclui uma imagem, a tag, todas as camadas exclusivas mencionadas pela imagem e todas as outras tags associadas à imagem.
  • Exclua digest manifesto: exclui uma imagem, todas as camadas exclusivas referenciadas pela imagem e todas as marcas associadas à imagem.

Para obter uma introdução sobre esses conceitos, confira informações sobre registros, repositórios e imagens.

Observação

Depois de excluir os dados da imagem, o Registro de Contêiner do Azure interrompe a cobrança imediatamente para o armazenamento associado. No entanto, o registro recupera o espaço de armazenamento associado usando um processo assíncrono. Leva algum tempo para que o registro limpe as camadas e mostre o uso de armazenamento atualizado.

Excluir repositório

A exclusão de um repositório exclui todas as imagens no repositório, incluindo todas as tags, camadas exclusivas e manifestos. Ao excluir um repositório, você recupera o espaço de armazenamento usado pelas imagens que fazem referência a camadas exclusivas desse repositório.

O seguinte comando da CLI do Azure exclui o repositório "acr-helloworld" e todas as tags e manifestos no repositório. Caso as camadas referenciadas pelos manifestos excluídos não sejam referenciadas por outras imagens no registro, os respectivos dados da camada também serão excluídos, recuperando o espaço de armazenamento.

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

Excluir por marca

Você pode excluir imagens individuais de um repositório especificando o nome e a marca do repositório na operação de exclusão. Quando você exclui por marca, recupera o espaço de armazenamento usado por qualquer camada exclusiva na imagem (camadas não compartilhadas por outras imagens no registro).

Para excluir por marca, use exclusão de repositório de acr az e especifique o nome da imagem no--image parâmetro. Todas as camadas exclusivas da imagem e quaisquer outras tags associadas à imagem são excluídas.

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

Dica

A exclusão de pela tag não deve ser confundida com a exclusão de uma tag (desmarcação). Você pode excluir uma marca com o comando da CLI do Azure repositório do acr az desmarcar. Nenhum espaço será liberado quando você desmarcar uma imagem porque o respectivo manifesto e os dados da camada permanecerão no Registro. Somente a referência de marca em si é excluída.

Excluir pelo manifesto digest

Um resumo do manifesto pode ser associado a uma, nenhuma ou várias tags. Quando você exclui por digest, todas as tags referenciadas pelo manifesto são excluídas, assim como os dados da camada para qualquer camada exclusiva da imagem. Compartilhado a camada de dados não são excluídos.

Para excluir, digest, a primeira lista o manifesto resumos para o repositório que contém as imagens que você deseja excluir. 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 da mensagem que deseja excluir na exclusão de repositório de acr az comando. O formato do comando é:

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

Por exemplo, para excluir o último manifesto listado na saída anterior (com a 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): 

A imagem acr-helloworld:v2 será excluída do Registro, assim como todos os dados exclusivos da camada dessa imagem. Se um manifesto é associado com várias marcas, todas as marcas associadas também são excluídas.

Excluir resumos da mensagem por carimbo de data/hora

Para manter o tamanho de um repositório ou Registro, talvez seja necessário excluir de tempos em tempos os resumos da mensagem de manifesto anteriores a uma determinada data.

O comando da CLI do Azure abaixo lista em ordem crescente todos os resumos da mensagem de manifesto anteriores a um carimbo de data/hora específico. Substitua <acrName> e <repositoryName> por valores apropriados para o seu ambiente. O carimbo de data/hora poderá ser uma expressão de data/hora completa ou uma data, conforme mostrado neste exemplo.

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

Após identificar resumos da mensagem de um manifesto obsoleto, será possível executar o script Bash a seguir para excluir resumos da mensagem de manifesto anteriores a um carimbo de data/hora específico. Ele requer a CLI do Azure e xargs. Por padrão, o script não realiza nenhuma exclusão. Altere o ENABLE_DELETE valor para true para ativar a exclusão da imagem.

Aviso

Use o script de exemplo abaixo com cuidado, pois os dados excluídos da imagem são IRRECUPERÁVEIS. Caso tenha sistemas que efetuam pull de imagens por resumo da mensagem de manifesto (em oposição ao nome da imagem), você não deverá executar esse script. Excluir os resumos da mensagem do manifesto impedirá que esses sistemas efetuem pull das imagens de seu Registro. Em vez de extrair pelo manifesto, considere a adoção de um esquema de marcação exclusiva esquema, 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

Excluir imagens sem marcas

Conforme mencionado na manifesto digest seção, enviar por push uma imagem modificada usando uma marca existente untags a imagem anteriormente enviada, resultando em uma imagem órfão (ou "pendentes"). A imagem anteriormente enviada de manifesto – e seus dados de camada-- permanece no registro. Considere a seguinte sequência de eventos:

  1. Enviar imagem por push acr helloworld com marca 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. Modifique acr helloworld Dockerfile

  4. Enviar imagem por push acr helloworld com marca 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 marcas é removida dos metadados quando uma imagem não possui marcas. Esse manifesto ainda existe no registro, junto com todos os dados de camada exclusivos que ele referencia. Para excluir tais órfão imagens e seus dados de camada, você deve excluir digest manifesto.

Limpar automaticamente as marcas e os manifestos

O Registro de Contêiner do Azure fornece os seguintes métodos automatizados para remover marcas e manifestos e seus dados de camada exclusivos associados:

  • Crie uma tarefa ACR que execute o comando de contêiner acr purge para excluir todas as marcas mais antigas do que uma determinada duração ou que correspondam a um filtro de nome especificado. Alternativamente, configure acr purge para excluir manifestos não marcados.

    O comando de contêiner acr purge está atualmente em versão prévia. Para obter mais informações, confira como Limpar imagens de modo automático de um Registro de Contêiner do Azure.

  • Como alternativa, defina uma política de retenção para cada Registro a fim de gerenciar os manifestos sem marcas. Ao habilitar uma política de retenção, os manifestos de imagem sem marcas associadas no Registro e os dados da camada subjacente serão excluídos de modo automático após um período definido.

    A política de retenção atualmente é uma versão prévia do recurso de registros de contêiner Premium. A política de retenção é aplicável somente a manifestos não marcados, criados depois que a política entra em vigor.

Próximas etapas

Para obter mais informações sobre o armazenamento de imagens no Registro de Contêiner do Azure, consulte Armazenamento de imagens de contêiner no Registro de Contêiner do Azure.