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 purge
alias 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 oacr purge --help
comoaz 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óriohello-world
,--filter "hello-world:^1.*"
corresponde às marcas que começam com1
no repositóriohello-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.