Como usar o comando docker buildx prune para gerenciar o cache de construção

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, exploraremos como gerenciar efetivamente o cache de construção do Docker usando o comando docker buildx prune. O cache de construção é um mecanismo crucial para acelerar as construções de imagens Docker, reutilizando camadas construídas anteriormente. No entanto, com o tempo, esse cache pode acumular-se e consumir espaço em disco significativo.

Começaremos construindo uma imagem Docker simples para gerar algum cache de construção. Em seguida, demonstraremos várias maneiras de podar (prune) este cache usando docker buildx prune. Isso inclui podar todo o cache sem filtros, podar seletivamente mantendo dados recentes usando a opção --filter, limitar o tamanho do cache com --keep-storage e, finalmente, podar todo o cache de construção, incluindo imagens internas, usando a flag --all. Ao final deste laboratório, você terá uma sólida compreensão de como gerenciar seu cache de construção do Docker de forma eficiente.

Construir uma imagem para criar o cache de construção

Nesta etapa, construiremos uma imagem Docker simples para criar algum cache de construção. O cache de construção do Docker é um mecanismo que acelera o processo de construção, reutilizando camadas de construções anteriores. Quando você constrói uma imagem Docker, cada instrução no Dockerfile cria uma camada. Se uma instrução não foi alterada desde a última construção, o Docker pode reutilizar a camada existente em vez de reconstruí-la.

Primeiro, vamos criar um diretório para nosso projeto e navegar até ele.

mkdir ~/project/docker-cache-demo
cd ~/project/docker-cache-demo

Agora, criaremos um Dockerfile simples. Este Dockerfile copiará um arquivo para a imagem e, em seguida, executará um comando.

nano Dockerfile

Adicione o seguinte conteúdo ao Dockerfile:

FROM ubuntu:latest
COPY . /app
RUN echo "Hello, Docker Cache!" > /app/message.txt
CMD ["cat", "/app/message.txt"]

Salve e feche o arquivo.

Em seguida, vamos criar um arquivo simples que copiaremos para a imagem.

nano message.txt

Adicione algum conteúdo a message.txt:

This is a test message.

Salve e feche o arquivo.

Agora, construiremos a imagem Docker. Marcaremos a imagem como cache-demo.

docker build -t cache-demo .

Você verá uma saída indicando que o Docker está construindo a imagem passo a passo. Cada etapa corresponde a uma instrução no Dockerfile. O Docker fará o download da imagem ubuntu:latest se ela ainda não estiver presente, copiará o arquivo message.txt e, em seguida, executará o comando echo.

Após a conclusão da construção, você pode verificar se a imagem foi criada listando as imagens disponíveis.

docker images

Você deve ver cache-demo na lista de imagens.

Agora, vamos construir a imagem novamente sem fazer nenhuma alteração no Dockerfile ou em message.txt.

docker build -t cache-demo .

Desta vez, você notará que o processo de construção é muito mais rápido. O Docker reutiliza as camadas existentes da construção anterior porque as instruções no Dockerfile e o conteúdo de message.txt não foram alterados. A saída mostrará "Using cache" (Usando cache) para a maioria das etapas. Isso demonstra como o cache de construção do Docker funciona para acelerar as construções subsequentes.

Podar o cache de construção sem filtros

Nesta etapa, aprenderemos como podar o cache de construção do Docker sem usar nenhum filtro. Podar o cache de construção ajuda a liberar espaço em disco, removendo as entradas de cache de construção não utilizadas.

O comando para podar o cache de construção é docker builder prune. Por padrão, este comando removerá todas as entradas de cache de construção que não são usadas por uma imagem existente no momento.

Vamos executar o comando para podar o cache de construção.

docker builder prune

Você será solicitado a confirmar a ação. Digite y e pressione Enter para prosseguir.

WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y

A saída mostrará as entradas de cache de construção que foram excluídas e a quantidade total de espaço recuperado.

Para ver o efeito da poda, vamos tentar construir a imagem novamente.

cd ~/project/docker-cache-demo
docker build -t cache-demo .

Desta vez, o processo de construção pode levar mais tempo do que a segunda construção na etapa anterior, pois parte ou todo o cache de construção pode ter sido removido. O Docker reconstruirá as camadas que foram podadas.

Podar sem filtros é útil quando você deseja limpar todo o cache de construção não utilizado para maximizar o espaço livre em disco. No entanto, isso pode impactar a velocidade de construção de construções subsequentes se você reconstruir imagens com frequência. Nas próximas etapas, exploraremos como usar filtros para ter mais controle sobre quais entradas de cache de construção são podadas.

Podar o cache de construção mantendo dados recentes usando --filter

Nesta etapa, aprenderemos como podar o cache de construção do Docker, mantendo dados recentes usando a flag --filter. Isso é útil quando você deseja liberar espaço em disco, mas ainda deseja se beneficiar do cache para construções recentes.

O comando docker builder prune suporta vários filtros. Um filtro útil é until, que permite remover entradas de cache de construção mais antigas que um determinado carimbo de data/hora (timestamp). O carimbo de data/hora pode ser uma data e hora, ou uma duração relativa ao tempo atual.

Vamos primeiro construir nossa imagem novamente para garantir que tenhamos algum cache de construção recente.

cd ~/project/docker-cache-demo
docker build -t cache-demo .

Agora, vamos podar o cache de construção, mantendo as entradas dos últimos 5 minutos. Podemos usar o filtro until com uma duração como 5m.

docker builder prune --filter "until=5m"

Você será solicitado a confirmar a ação. Digite y e pressione Enter para prosseguir.

WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y

A saída mostrará as entradas de cache de construção que foram excluídas. Apenas as entradas com mais de 5 minutos serão removidas.

Você também pode especificar um carimbo de data/hora específico. Por exemplo, para remover entradas de cache mais antigas que uma data e hora específica, você usaria um formato como "AAAA-MM-DDTHH:MM:SS".

Usar o filtro until com uma duração é uma maneira conveniente de manter o cache de construção mais recente, limpando as entradas mais antigas, equilibrando o uso do espaço em disco e a velocidade de construção.

Podar o cache de construção mantendo um tamanho específico usando --keep-storage

Nesta etapa, aprenderemos como podar o cache de construção do Docker, mantendo uma quantidade específica de armazenamento usando a flag --keep-storage. Isso é útil quando você deseja limitar a quantidade de espaço em disco usado pelo cache de construção.

O comando docker builder prune com a flag --keep-storage permite que você especifique a quantidade máxima de armazenamento a ser mantida para o cache de construção. O Docker removerá as entradas de cache de construção mais antigas até que o tamanho total do cache restante esteja abaixo do limite especificado.

Vamos primeiro construir nossa imagem algumas vezes para criar mais entradas de cache de construção.

cd ~/project/docker-cache-demo
docker build -t cache-demo:v1 .
docker build -t cache-demo:v2 .

Agora, vamos podar o cache de construção, mantendo apenas 1GB de armazenamento. Você pode especificar o tamanho em bytes, kilobytes (k), megabytes (m) ou gigabytes (g).

docker builder prune --keep-storage 1g

Você será solicitado a confirmar a ação. Digite y e pressione Enter para prosseguir.

WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y

A saída mostrará as entradas de cache de construção que foram excluídas e a quantidade total de espaço recuperado. O Docker removerá as entradas de cache mais antigas até que o tamanho total do cache restante seja aproximadamente 1GB ou menos.

Usar a flag --keep-storage é uma boa maneira de gerenciar o espaço em disco consumido pelo cache de construção, especialmente em ambientes com armazenamento limitado.

Podar todo o cache de construção, incluindo imagens internas, usando --all

Nesta etapa, aprenderemos como podar todo o cache de construção do Docker, incluindo imagens internas, usando a flag --all. Esta é a maneira mais agressiva de limpar o cache de construção e removerá todas as entradas de cache, independentemente de serem usadas por imagens existentes.

O comando docker builder prune com a flag --all (-a é uma abreviação) removerá todas as entradas de cache de construção. Isso inclui entradas de cache que estão associadas a imagens de construção intermediárias que não estão marcadas (tagged).

Vamos executar o comando para podar todo o cache de construção.

docker builder prune --all

Você será solicitado a confirmar a ação. Digite y e pressione Enter para prosseguir.

WARNING! This will remove all build cache.
Are you sure you want to continue? [y/N] y

A saída mostrará todas as entradas de cache de construção que foram excluídas e a quantidade total de espaço recuperado. Este comando normalmente liberará a maior quantidade de espaço em disco em comparação com a poda sem a flag --all ou usando filtros.

Após executar este comando, se você construir a imagem cache-demo novamente, provavelmente levará mais tempo porque todo o cache de construção foi removido, e o Docker precisará reconstruir todas as camadas.

cd ~/project/docker-cache-demo
docker build -t cache-demo .

Usar docker builder prune --all é útil quando você precisa liberar o máximo de espaço em disco possível ou quando deseja garantir uma construção limpa sem depender de nenhum cache existente. No entanto, esteja ciente de que isso irá desacelerar significativamente as construções subsequentes até que um novo cache seja gerado.

Resumo

Neste laboratório, aprendemos como gerenciar o cache de construção do Docker usando o comando docker buildx prune. Começamos construindo uma imagem Docker simples para gerar o cache de construção, observando como o Docker reutiliza camadas para construções subsequentes mais rápidas.

Em seguida, exploramos diferentes maneiras de podar o cache de construção. Aprendemos como podar todo o cache de construção sem filtros, como manter dados de cache recentes usando a opção --filter, como limitar o tamanho do cache usando --keep-storage e, finalmente, como remover todo o cache de construção, incluindo imagens internas, com a flag --all. Essas técnicas são essenciais para gerenciar o espaço em disco e otimizar ambientes de construção.