Limpar automaticamente as imagens de um registro de contêiner do Azure

Quando você usa um registro de contêiner do Azure como parte de um fluxo de trabalho de desenvolvimento, o registro pode ficar rapidamente lotado de imagens ou outros artefatos que não são necessários após um curto período. Talvez seja conveniente excluir todas as marcas anteriores a uma determinada duração ou que correspondam a um filtro de nome especificado. Para excluir vários artefatos rapidamente, este artigo apresenta o comando acr purge, que você pode executar quando necessário ou como uma Tarefa do ACR agendada.

O comando acr purge está atualmente distribuído em uma imagem de contêiner pública (mcr.microsoft.com/acr/acr-cli:0.5), criada a partir do código-fonte no repositório ACR-CLI do GitHub. O acr purge está em versão prévia no momento.

Use o Azure Cloud Shell ou uma instalação local da CLI do Azure para executar os exemplos de comando deste artigo. Para usá-lo localmente, é necessária a versão 2.0.76 ou posterior. Execute az --version para encontrar a versão. Se você precisa instalar ou atualizar, consulte Instalar a CLI do Azure.

Aviso

Use o comando acr purge com cautela, pois os dados excluídos da imagem são IRRECUPERÁVEIS. Se você tiver sistemas que extraem imagens pelo resumo do manifesto (e não pelo nome da imagem), não deve limpar imagens sem marcas. A exclusão de imagens não marcadas impedirá esses sistemas de puxar as imagens do 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.

Para excluir as marcas de imagem ou manifestos individuais usando comandos do CLI do Azure, consulte Excluir imagens de contêiner no Registro de Contêiner do Azure.

Usar o comando de limpeza

O comando de contêiner acr purge exclui imagens por marca em um repositório que corresponda a um filtro de nome e que seja mais antigo do que uma duração especificada. Por padrão, somente referências da marca são excluídas, não os manifestos subjacentes e os dados de camada. O comando tem uma opção para também excluir manifestos.

Observação

O comando acr purge não exclui uma marca de imagem nem repositório em que o atributo write-enabled está definido como false. Para obter mais informações, confira Bloquear uma imagem de contêiner em um Registro de Contêiner do Azure.

acr purge foi projetado para ser executado como um comando de contêiner em uma Tarefa de ACR, para que seja autenticado automaticamente com o registro em que a tarefa é executada e realiza ações. Os exemplos de tarefas neste artigo usam o comando acr purgealias no lugar de um comando de imagem de contêiner totalmente qualificado.

Importante

  • O comando padrão para executar o acr purge é az acr run --registry <YOUR_REGISTRY> --cmd 'acr purge --optional parameter' /dev/null.
  • É recomendável executar o comando completo acr purge para usar a Limpeza do ACR. Por exemplo, execute o acr purge --help como az acr run --registry <YOUR_REGISTRY> --cmd 'acr purge --help' /dev/null.

No mínimo, especifique o seguinte ao executar acr purge:

  • --filter – Uma expressão regular de nome de repositório e uma expressão regular de nome de marca para filtrar imagens no registro. Exemplos: --filter "hello-world:.*" corresponde a todas as marcas no repositório hello-world, --filter "hello-world:^1.*" corresponde às marcas que começam com 1 no repositório hello-world e --filter ".*/cache:.*" corresponde a todas as marcas nos repositórios que terminam com /cache. Você também pode passar vários parâmetros --filter.
  • --ago - Uma cadeia de caracteres de duração no estilo Go para indicar uma duração após as imagens excluídas. A duração consiste em uma sequência de um ou mais números decimais, cada um com um sufixo de unidade. As unidades de tempo válidas incluem "d" para dias, "h" para horas e "m" para minutos. Por exemplo, --ago 2d3h6m seleciona todas as imagens filtradas cuja última modificação foi a mais de 3 dias, 6 horas e 1.5 minutos atrás e --ago 1.5h seleciona as imagens cuja última modificação foi a mais de 1,5 hora.

acr purge é compatível com vários parâmetros opcionais. Os dois exemplos a seguir são usados neste artigo:

  • --untagged - especifica que todos os manifestos que não têm marcas associadas (manifestos sem marca) serão excluídos. Esse parâmetro também exclui manifestos sem marcação, além de marcas que já estão sendo excluídas. Remover todas as marcas associadas a um manifesto para limpá-lo. Somente após isso é possível limpar um manifesto sem marca usando --untagged.
  • --dry-run - especifica que nenhum dado é excluído, mas o resultado é o mesmo do comando executado sem esse sinalizador. Esse parâmetro é útil para testar um comando de limpeza a fim de garantir que ele não exclua inadvertidamente os dados que você pretende preservar.
  • --keep: especifica que o número x mais recente de marcas a serem excluídas é retido. As marcas mais recentes são determinadas pela hora da última modificação da marca.
  • --concurrency: especifica um número de tarefas de limpeza a serem processadas simultaneamente. Um valor padrão será usado se esse parâmetro não for fornecido.

Observação

O filtro --untagged não responde ao filtro --ago. Para parâmetros adicionais, execute acr purge --help.

O acr purge é compatível com outros recursos dos comandos das Tarefas do ACR, incluindo variáveis de execução e logs de execução de tarefa que são transmitidos e também salvos para recuperação posterior.

Executar em uma tarefa sob demanda

O exemplo a seguir usa o comando az acr run para executar o comando acr purge sob demanda. Este exemplo exclui todas as marcas de imagem e manifestos no repositório de hello-world em myregistry que foram modificadas há mais de um dia e todos os manifestos sem marca. O comando do contêiner é passado usando uma variável de ambiente. A tarefa é executada sem um contexto de origem.

# Environment variable for container command line
PURGE_CMD="acr purge --filter 'hello-world:.*' \
  --untagged --ago 1d"

az acr run \
  --cmd "$PURGE_CMD" \
  --registry myregistry \
  /dev/null

Executar em uma tarefa agendada

O exemplo a seguir usa o comando az acr task create para criar uma tarefa de ACR agendada diariamente. A tarefa limpa as marcas modificadas há mais de 7 dias no repositório hello-world. O comando do contêiner é passado usando uma variável de ambiente. A tarefa é executada sem um contexto de origem.

# Environment variable for container command line
PURGE_CMD="acr purge --filter 'hello-world:.*' \
  --ago 7d"

az acr task create --name purgeTask \
  --cmd "$PURGE_CMD" \
  --schedule "0 0 * * *" \
  --registry myregistry \
  --context /dev/null

Execute o comando az acr task show para ver se o gatilho do temporizador está configurado.

Limpar grandes números de marcas e manifestos

A limpeza de um grande número de marcas e manifestos pode levar vários minutos ou mais. Para limpar milhares de marcas e manifestos, o comando pode precisar ser executado por mais tempo do que o período padrão de 600 segundos para uma tarefa sob demanda ou 3600 segundos para uma tarefa agendada. Se o tempo limite for excedido, apenas um subconjunto de marcas e manifestos será excluído. Para garantir que uma limpeza em larga escala seja concluída, use o parâmetro --timeout para aumentar o valor.

Por exemplo, a seguinte tarefa sob demanda define um tempo limite de 3600 segundos (1 hora):

# Environment variable for container command line
PURGE_CMD="acr purge --filter 'hello-world:.*' \
  --ago 1d --untagged"

az acr run \
  --cmd "$PURGE_CMD" \
  --registry myregistry \
  --timeout 3600 \
  /dev/null

Exemplo: Limpeza agendada de vários repositórios em um registro

Este exemplo demonstra o uso de acr purge para limpar periodicamente vários repositórios em um registro. Por exemplo, você pode ter um pipeline de desenvolvimento que efetua push das imagens para os repositórios samples/devimage1 e samples/devimage2. Você importa periodicamente as imagens de desenvolvimento para um repositório de produção para suas implantações, então não precisa mais das imagens de desenvolvimento. Semanalmente, você limpa os repositórios samples/devimage1 e samples/devimage2, em preparação para o trabalho da próxima semana.

Visualizar a limpeza

Antes de excluir dados, é recomendado executar uma tarefa de limpeza sob demanda usando o parâmetro --dry-run. Essa opção permite que você veja as marcas e os manifestos que o comando limpará, sem remover nenhum dado.

No exemplo a seguir, o filtro em cada repositório seleciona todas as marcas. O parâmetro --ago 0d corresponde a imagens de todas as idades nos repositórios que correspondem aos filtros. Modifique os critérios de seleção conforme necessário para seu cenário. O parâmetro --untagged indica que os manifestos são excluídos, além das marcas. O comando do contêiner é passado para o comando az acr run usando uma variável de ambiente.

# Environment variable for container command line
PURGE_CMD="acr purge \
  --filter 'samples/devimage1:.*' --filter 'samples/devimage2:.*' \
  --ago 0d --untagged --dry-run"

az acr run \
  --cmd "$PURGE_CMD" \
  --registry myregistry \
  /dev/null

Examine a saída do comando para ver as marcas e os manifestos que correspondem aos parâmetros de seleção. Como o comando é executado com --dry-run, nenhum dado é excluído.

Saída de exemplo:

[...]
Deleting tags for repository: samples/devimage1
myregistry.azurecr.io/samples/devimage1:232889b
myregistry.azurecr.io/samples/devimage1:a21776a
Deleting manifests for repository: samples/devimage1
myregistry.azurecr.io/samples/devimage1@sha256:81b6f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e788b
myregistry.azurecr.io/samples/devimage1@sha256:3ded859790e68bd02791a972ab0bae727231dc8746f233a7949e40f8ea90c8b3
Deleting tags for repository: samples/devimage2
myregistry.azurecr.io/samples/devimage2:5e788ba
myregistry.azurecr.io/samples/devimage2:f336b7c
Deleting manifests for repository: samples/devimage2
myregistry.azurecr.io/samples/devimage2@sha256:8d2527cde610e1715ad095cb12bc7ed169b60c495e5428eefdf336b7cb7c0371
myregistry.azurecr.io/samples/devimage2@sha256:ca86b078f89607bc03ded859790e68bd02791a972ab0bae727231dc8746f233a

Number of deleted tags: 4
Number of deleted manifests: 4
[...]

Agendar a limpeza

Depois de verificar a simulação, crie uma tarefa agendada para automatizar a limpeza. O exemplo a seguir agenda uma tarefa semanal no domingo, 1:00 UTC, para executar o comando de limpeza anterior:

# Environment variable for container command line
PURGE_CMD="acr purge \
  --filter 'samples/devimage1:.*' --filter 'samples/devimage2:.*' \
  --ago 0d --untagged"

az acr task create --name weeklyPurgeTask \
  --cmd "$PURGE_CMD" \
  --schedule "0 1 * * Sun" \
  --registry myregistry \
  --context /dev/null

Execute o comando az acr task show para ver se o gatilho do temporizador está configurado.

Próximas etapas

Saiba mais sobre outras opções para excluir dados de imagem no Registro de Contêiner do Azure.

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