Partilhar via


Eliminar imagens de contentor no Azure Container Registry

Para manter o tamanho do seu registro de contêiner do Azure, você deve excluir periodicamente os dados de imagem obsoletos. Enquanto algumas imagens de contêiner implantadas na produção podem exigir armazenamento de longo prazo, outras normalmente podem ser excluídas mais rapidamente. Por exemplo, em um cenário de compilação e teste automatizado, seu registro pode ser rapidamente preenchido com imagens que podem nunca ser implantadas e podem ser limpas logo após concluir a compilação e o teste aprovado.

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 aborda vários métodos para excluir dados de imagem:

  • Excluir um repositório: exclui todas as imagens e todas as camadas exclusivas dentro do repositório.
  • Excluir por tag: exclui uma imagem, a tag , todas as camadas exclusivas referenciadas pela imagem e todas as outras tags associadas à imagem.
  • Excluir por resumo de manifesto: exclui uma imagem, todas as camadas exclusivas referenciadas pela imagem e todas as tags associadas à imagem.

Para obter uma introdução a esses conceitos, consulte Sobre registros, repositórios e imagens.

Nota

Depois de excluir dados de imagem, o Registro de Contêiner do Azure interrompe a cobrança imediata pelo armazenamento associado. No entanto, o registro recupera o espaço de armazenamento associado usando um processo assíncrono. Leva algum tempo até 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 nesse repositório.

O comando CLI do Azure a seguir exclui o repositório "acr-helloworld" e todas as tags e manifestos dentro do repositório. Se as camadas referenciadas pelos manifestos excluídos não forem referenciadas por nenhuma outra imagem no registro, seus dados de camada também serão excluídos, recuperando o espaço de armazenamento.

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

Excluir por tag

Você pode excluir imagens individuais de um repositório especificando o nome e a tag do repositório na operação de exclusão. Ao excluir por tag, você recupera o espaço de armazenamento usado por quaisquer camadas exclusivas na imagem (camadas não compartilhadas por outras imagens no registro).

Para excluir por tag, use az acr repository delete e especifique o nome da --image imagem no 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):

Gorjeta

A exclusão por tag não deve ser confundida com a exclusão de uma tag (desmarcação). Você pode excluir uma tag com o comando az acr repository untag da CLI do Azure. Nenhum espaço é liberado quando você desmarca uma imagem porque seus dados de manifesto e camada permanecem no registro. Apenas a referência da tag em si é excluída.

Excluir por resumo de manifesto

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

Para excluir por resumo, primeiro liste os resumos de manifesto 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 que deseja excluir no comando az acr repository delete . 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 acr-helloworld:v2 imagem é excluída do registro, assim como qualquer camada de dados exclusiva dessa imagem. Se um manifesto estiver associado a várias tags, todas as tags associadas também serão excluídas.

Excluir resumos por carimbo de data/hora

Para manter o tamanho de um repositório ou registro, talvez seja necessário excluir periodicamente resumos de manifesto anteriores a uma determinada data.

O comando da CLI do Azure a seguir lista todos os resumos de manifesto em um repositório mais antigo que um carimbo de data/hora especificado, em ordem crescente. Substitua <acrName> e <repositoryName> por valores apropriados 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, você pode executar o seguinte script Bash para excluir resumos de manifesto anteriores a um carimbo de data/hora especificado. Ele requer a CLI do Azure e xargs. Por padrão, o script não executa nenhuma exclusão. Altere o valor para true para habilitar a ENABLE_DELETE exclusão de imagem.

Aviso

Use o seguinte script de exemplo com cuidado - os dados de imagem excluídos são irrecuperáveis. Se você tiver sistemas que extraem imagens por resumo de manifesto (em oposição ao nome da imagem), não deverá executar esses scripts. Excluir os resumos de manifesto impedirá que esses sistemas extraiam as imagens do seu registro. Em vez de puxar por manifesto, considere adotar um esquema de marcação exclusivo, uma prática recomendada 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 não marcadas

Como mencionado na seção Resumo do manifesto, enviar uma imagem modificada usando uma tag existente desmarca a imagem enviada anteriormente, resultando em uma imagem órfã (ou "pendurada"). O manifesto da imagem enviada anteriormente - e seus dados de camada - permanece no registro. Considere a seguinte sequência de eventos:

  1. Push image acr-helloworld com tag mais recente: docker push myregistry.azurecr.io/acr-helloworld:latest

  2. Verifique os manifestos para o 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 acr-helloworld Dockerfile

  4. Push image acr-helloworld com tag mais recente: docker push myregistry.azurecr.io/acr-helloworld:latest

  5. Verifique os manifestos para o 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 tags é removida dos metadados quando uma imagem é desmarcada. Esse manifesto ainda existe dentro do registro, juntamente com quaisquer dados de camada exclusivos que ele referencia. Para excluir essas imagens órfãs e seus dados de camada, você deve excluir por resumo de manifesto.

Limpar automaticamente tags e 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 acr purge comando container para excluir todas as tags mais antigas que uma determinada duração ou que correspondam a um filtro de nome especificado. Opcionalmente, configure acr purge para excluir manifestos não marcados.

    O acr purge comando container está atualmente em visualização. Para obter mais informações, consulte Limpar imagens automaticamente de um registro de contêiner do Azure.

  • Opcionalmente, defina uma política de retenção para cada registro, para gerenciar manifestos não marcados. Quando você habilita uma política de retenção, os manifestos de imagem no Registro que não têm marcas associadas e os dados da camada subjacente são excluídos automaticamente após um período definido.

    A política de retenção é atualmente um recurso de visualização dos registros de contêiner Premium . A política de retenção só se aplica a manifestos não marcados criados após a política entrar em vigor.

Próximos passos

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.