Limpar automaticamente 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 ser rapidamente preenchido com imagens ou outros artefatos que não são necessários após um curto período. Talvez você queira excluir todas as tags que são mais antigas do que uma determinada duração ou correspondem a um filtro de nome especificado. Para excluir vários artefatos rapidamente, este artigo apresenta o acr purge comando que você pode executar como uma tarefa ACR sob demanda ou agendada .

O acr purge comando é atualmente distribuído em uma imagem de contêiner público (mcr.microsoft.com/acr/acr-cli:0.5), construída a partir do código-fonte no repositório acr-cli no GitHub. acr purge está atualmente em pré-visualização.

Você pode usar o Azure Cloud Shell ou uma instalação local da CLI do Azure para executar os exemplos de tarefas ACR neste artigo. Se você quiser usá-lo localmente, a versão 2.0.76 ou posterior é necessária. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).

Aviso

Use o acr purge comando 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 deve limpar imagens não marcadas. A exclusão de imagens não marcadas 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.

Se você quiser excluir marcas de imagem única ou manifestos usando comandos da CLI do Azure, consulte Excluir imagens de contêiner no Registro de Contêiner do Azure.

Usar o comando purge

O acr purge comando container exclui imagens por tag em um repositório que correspondem a um filtro de nome e que são mais antigas do que uma duração especificada. Por padrão, apenas as referências de tag 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.

Nota

acr purge não exclui uma marca de imagem ou repositório onde o write-enabled atributo está definido como false. Para obter informações, consulte Bloquear uma imagem de contêiner em um registro de contêiner do Azure.

acr purge é projetado para ser executado como um comando de contêiner em uma tarefa ACR, para que ele se autentique automaticamente com o registro onde a tarefa é executada e executa ações lá. Os exemplos de tarefas neste artigo usam o acr purge alias de comando 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.
  • Recomendamos executar o comando complete acr purge para usar o ACR Purge. 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 tag para filtrar imagens no registro. Exemplos: --filter "hello-world:.*" corresponde a todas as tags no hello-world repositório, --filter "hello-world:^1.*" às tags que começam no 1hello-world repositório e --filter ".*/cache:.*" a todas as tags nos repositórios que terminam em /cache. Você também pode passar vários --filter parâmetros.
  • --ago- Uma string de duração no estilo Go para indicar uma duração além da qual as imagens são excluídas. A duração consiste numa sequência de um ou mais números decimais, cada um com um sufixo unitário. 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 modificadas pela última vez há mais de dois dias, 3 horas e 6 minutos e --ago 1.5h seleciona as imagens modificadas pela última vez há mais de 1,5 horas.

acr purge suporta vários parâmetros opcionais. Os dois seguintes são usados em exemplos neste artigo:

  • --untagged - Especifica que todos os manifestos que não têm tags associadas (manifestos não marcados) são excluídos. Esse parâmetro também exclui manifestos não marcados, além de tags que já estão sendo excluídas.
  • --dry-run - Especifica que nenhum dado é excluído, mas a saída é a mesma como se o comando fosse executado sem esse sinalizador. Esse parâmetro é útil para testar um comando purge para garantir que ele não exclua inadvertidamente os dados que você pretende preservar.
  • --keep - Especifica que o número x mais recente de tags a serem excluídas é mantido. As tags mais recentes são determinadas pela hora da última modificação da tag.
  • --concurrency - Especifica um número de tarefas de limpeza para processar simultaneamente. Um valor padrão será usado se esse parâmetro não for fornecido.

Nota

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

acr purge suporta outros recursos dos comandos ACR Tasks, incluindo variáveis de execução e logs de execução de tarefas 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 acr purge comando on-demand. Este exemplo exclui todas as marcas de imagem e manifestos no hello-world repositório em myregistry que foram modificados há mais de 1 dia e todos os manifestos não marcados. O comando container é 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 ACR agendada diariamente. A tarefa limpa tags modificadas há mais de 7 dias no hello-world repositório. O comando container é 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 um grande número de tags e manifestos

Limpar um grande número de tags e manifestos pode levar vários minutos ou mais. Para limpar milhares de tags e manifestos, o comando pode precisar ser executado por mais tempo do que o tempo limite 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 tags e manifestos será excluído. Para garantir que uma limpeza em grande escala seja concluída, passe o --timeout parâmetro 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 explica o uso acr purge para limpar periodicamente vários repositórios em um registro. Por exemplo, você pode ter um pipeline de desenvolvimento que envia imagens para os samples/devimage1 repositórios e samples/devimage2 . Você importa periodicamente imagens de desenvolvimento para um repositório de produção para suas implantações, para que não precise mais das imagens de desenvolvimento. Semanalmente, você limpa os samples/devimage1 repositórios samples/devimage2 , em preparação para o trabalho da próxima semana.

Visualizar a limpeza

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

No exemplo a seguir, o filtro em cada repositório seleciona todas as tags. O --ago 0d parâmetro 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 o seu cenário. O --untagged parâmetro indica para excluir manifestos além de tags. O comando container é 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

Revise a saída do comando para ver as tags e 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
[...]

Agende o expurgo

Depois de verificar a execução a seco, crie uma tarefa agendada para automatizar a limpeza. O exemplo a seguir agenda uma tarefa semanal no domingo às 1:00 UTC para executar o comando purge 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óximos passos

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

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