Introdução
Neste laboratório, você aprenderá como gerenciar efetivamente o cache de construção do Docker usando o comando docker builder prune. Começaremos construindo uma imagem Docker simples para entender como o cache de construção é criado e utilizado para acelerar as construções subsequentes.
Após a construção da imagem, você explorará diferentes maneiras de limpar o cache de construção. Isso inclui a poda (pruning) do cache de construção pendente (dangling), a remoção de todo o cache de construção não utilizado e o uso de filtros para podar seletivamente o cache. Finalmente, você aprenderá como podar o cache de construção preservando o espaço de armazenamento, fornecendo uma compreensão abrangente das técnicas de gerenciamento do cache de construção.
Construir uma imagem para criar o cache de construção
Nesta etapa, construiremos uma imagem Docker simples para entender como o cache de construção é criado. O Docker usa um cache de construção para acelerar as construções subsequentes. Cada instrução em um Dockerfile cria uma camada (layer), e se a instrução não mudou desde a última construção, o Docker pode reutilizar a camada existente do cache.
Primeiro, navegue para o diretório ~/project se você ainda não estiver lá.
cd ~/project
Agora, vamos criar um Dockerfile simples. Vamos chamá-lo de Dockerfile.cache.
nano Dockerfile.cache
Adicione o seguinte conteúdo ao arquivo Dockerfile.cache:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends curl
COPY . /app
WORKDIR /app
CMD ["curl", "https://www.example.com"]
Salve o arquivo e saia do editor nano (Pressione Ctrl + X, depois Y, depois Enter).
Este Dockerfile faz o seguinte:
FROM ubuntu:latest: Começa com a imagem base Ubuntu mais recente.RUN apt-get update && apt-get install -y --no-install-recommends curl: Atualiza a lista de pacotes e instala o pacotecurl. Esta é uma operação comum e provavelmente será armazenada em cache em construções subsequentes se a imagem base e esta instrução não mudarem.COPY . /app: Copia o conteúdo do diretório atual para o diretório/appna imagem.WORKDIR /app: Define o diretório de trabalho como/app.CMD ["curl", "https://www.example.com"]: Especifica o comando a ser executado quando um contêiner é iniciado a partir desta imagem.
Antes de construir, vamos garantir que temos a imagem ubuntu:latest localmente. Caso contrário, o Docker irá baixá-la automaticamente durante a construção, mas baixá-la explicitamente primeiro pode, às vezes, tornar a saída da construção mais clara.
docker pull ubuntu:latest
Agora, vamos construir a imagem usando o arquivo Dockerfile.cache. Vamos marcar a imagem como myimage:cachetest.
docker build -t myimage:cachetest -f Dockerfile.cache .
Você verá uma saída indicando as etapas do processo de construção. O Docker executará cada instrução no Dockerfile. Como esta é a primeira vez que constrói com este Dockerfile, o Docker não usará nenhum cache de construção para as camadas definidas neste Dockerfile.
Após a conclusão da construção, você pode listar suas imagens para ver a recém-criada myimage:cachetest.
docker images
Você deve ver myimage com a tag cachetest na lista. Este processo de construção criou o cache de construção para cada camada definida no Dockerfile.cache. Nas próximas etapas, exploraremos como gerenciar este cache de construção.
Podar o cache de construção pendente
Nesta etapa, aprenderemos como podar o cache de construção pendente. O cache de construção pendente se refere às camadas (layers) de cache de construção que não estão mais associadas a nenhuma imagem nomeada. Isso pode acontecer quando você reconstrói uma imagem e uma camada anterior é substituída por uma nova. A poda do cache pendente pode ajudar a liberar espaço em disco.
Primeiro, vamos modificar nosso Dockerfile.cache ligeiramente para criar algum cache pendente. Vamos alterar a instrução RUN.
Navegue para o diretório ~/project se você ainda não estiver lá.
cd ~/project
Abra o arquivo Dockerfile.cache para edição.
nano Dockerfile.cache
Altere a instrução RUN de:
RUN apt-get update && apt-get install -y --no-install-recommends curl
para:
RUN apt-get update && apt-get install -y --no-install-recommends wget
Salve o arquivo e saia do editor nano (Pressione Ctrl + X, depois Y, depois Enter).
Agora, vamos reconstruir a imagem com a mesma tag.
docker build -t myimage:cachetest -f Dockerfile.cache .
Observe a saída. O Docker provavelmente reutilizará a camada FROM do cache, mas a instrução RUN foi alterada, então ele executará essa etapa novamente, criando uma nova camada. A camada anterior criada pela antiga instrução RUN agora é um cache de construção pendente porque não faz mais parte da imagem myimage:cachetest.
Para ver o cache de construção, você pode usar o comando docker builder prune --dry-run, embora nem sempre seja fácil distinguir o cache pendente especificamente sem ferramentas mais avançadas ou compreensão da saída do buildkit. Uma maneira mais simples de ver o efeito é podar o cache pendente e ver o espaço recuperado.
Para podar apenas o cache de construção pendente, usamos o comando docker builder prune com a opção --filter dangling=true.
docker builder prune --filter dangling=true
Você será solicitado a confirmar a ação. Digite y e pressione Enter.
WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y
A saída mostrará a quantidade de espaço recuperado. Este espaço foi ocupado pelas camadas de cache de construção pendentes que não eram mais necessárias.
Ao podar o cache de construção pendente, você pode recuperar o espaço em disco que não está mais sendo usado por nenhuma camada de imagem ativa.
Podar todo o cache de construção não utilizado
Nesta etapa, aprenderemos como podar todo o cache de construção não utilizado. Enquanto a poda do cache pendente remove camadas não associadas a nenhuma imagem, a poda de todo o cache não utilizado remove qualquer cache de construção que não esteja sendo usado atualmente por um contêiner em execução ou referenciado por uma imagem local. Esta é uma maneira mais agressiva de liberar espaço em disco.
Primeiro, vamos criar outra imagem usando um Dockerfile diferente para adicionar mais cache de construção.
Navegue para o diretório ~/project se você ainda não estiver lá.
cd ~/project
Crie um novo Dockerfile chamado Dockerfile.another.
nano Dockerfile.another
Adicione o seguinte conteúdo ao Dockerfile.another:
FROM alpine:latest
RUN apk update && apk add --no-cache git
COPY . /app2
WORKDIR /app2
CMD ["git", "--version"]
Salve o arquivo e saia do editor nano (Pressione Ctrl + X, depois Y, depois Enter).
Este Dockerfile usa a imagem base alpine e instala o git.
Agora, construa uma imagem usando este novo Dockerfile. Vamos marcá-la como anotherimage:latest.
docker build -t anotherimage:latest -f Dockerfile.another .
Esta construção criará novas camadas de cache de construção específicas para este Dockerfile.
Para podar todo o cache de construção não utilizado, usamos o comando docker builder prune sem nenhum filtro.
docker builder prune -a
A flag -a significa "all" (tudo) e indica que você deseja remover todo o cache de construção não utilizado, não apenas o cache pendente.
Você será solicitado a confirmar a ação. Digite y e pressione Enter.
WARNING! This will remove all unused build cache.
Are you sure you want to continue? [y/N] y
A saída mostrará a quantidade de espaço recuperado. Este comando remove quaisquer camadas de cache de construção que não estejam sendo referenciadas atualmente por uma imagem local ou um contêiner em execução. Isso pode liberar uma quantidade significativa de espaço em disco, especialmente após muitas construções e atualizações de imagem.
Tenha em mente que a poda de todo o cache não utilizado pode significar que as construções subsequentes de imagens que você ainda tem localmente podem levar mais tempo se dependerem das camadas de cache removidas.
Podar cache de construção com filtro
Nesta etapa, exploraremos como podar o cache de construção usando filtros. Os filtros permitem que você remova seletivamente o cache de construção com base em certos critérios, dando a você um controle mais granular sobre o que é removido.
Já vimos o filtro dangling=true em uma etapa anterior. Outro filtro útil é until, que permite remover o cache de construção criado antes de um determinado carimbo de data/hora (timestamp).
Primeiro, vamos construir nossa imagem myimage:cachetest novamente para garantir que tenhamos um cache de construção recente.
Navegue para o diretório ~/project se você ainda não estiver lá.
cd ~/project
Construa a imagem novamente:
docker build -t myimage:cachetest -f Dockerfile.cache .
Agora, vamos simular um cenário em que você deseja remover o cache de construção que é mais antigo do que um determinado tempo. Para fins de demonstração, usaremos um filtro para remover o cache com mais de alguns minutos.
Para podar o cache de construção mais antigo do que um tempo específico, você pode usar a opção --filter until=<timestamp>. O carimbo de data/hora pode estar em vários formatos, incluindo uma duração como 5m (5 minutos) ou 2h (2 horas).
Vamos podar o cache de construção que é mais antigo do que 5 minutos.
docker builder prune --filter until=5m
Você será solicitado a confirmar a ação. Digite y e pressione Enter.
WARNING! This will remove all build cache created before 5 minutes ago.
Are you sure you want to continue? [y/N] y
A saída mostrará a quantidade de espaço recuperado do cache de construção que era mais antigo do que 5 minutos. Se você acabou de construir a imagem, pode não haver muito cache com mais de 5 minutos, mas em um cenário real com muitas construções ao longo do tempo, este filtro pode ser muito útil para limpar o cache antigo.
Você também pode combinar filtros. Por exemplo, para podar o cache pendente mais antigo do que um determinado tempo, você pode usar:
docker builder prune --filter dangling=true --filter until=24h
Isso removeria apenas o cache de construção pendente que é mais antigo do que 24 horas.
O uso de filtros oferece flexibilidade no gerenciamento do seu cache de construção e ajuda você a liberar espaço em disco de forma mais estratégica.
Podar cache de construção mantendo o armazenamento
Nesta etapa, aprenderemos como podar o cache de construção, mantendo uma certa quantidade de armazenamento. Isso é útil quando você deseja liberar espaço em disco, mas ainda reter algum cache de construção recente para acelerar as construções futuras.
O comando docker builder prune possui uma opção --keep-storage que permite especificar a quantidade máxima de armazenamento a ser mantida para o cache de construção. Você pode especificar o tamanho em bytes ou usar unidades como k, m ou g.
Primeiro, vamos garantir que tenhamos algum cache de construção para podar. Construímos imagens nas etapas anteriores, o que criou cache.
Navegue para o diretório ~/project se você ainda não estiver lá.
cd ~/project
Para podar o cache de construção, mantendo uma quantidade específica de armazenamento, use a opção --keep-storage seguida pelo tamanho desejado. Por exemplo, para manter um máximo de 1GB de cache de construção:
docker builder prune --keep-storage 1g
Você será solicitado a confirmar a ação. Digite y e pressione Enter.
WARNING! This will remove all build cache exceeding 1GB.
Are you sure you want to continue? [y/N] y
A saída mostrará a quantidade de espaço recuperado. O Docker removerá as camadas de cache de construção mais antigas até que o tamanho total do cache de construção esteja abaixo do limite --keep-storage especificado.
Você pode ajustar o valor de --keep-storage com base no seu espaço em disco disponível e na quantidade de cache que deseja reter para construções mais rápidas. Por exemplo, para manter um máximo de 500MB:
docker builder prune --keep-storage 500m
Novamente, confirme a ação digitando y e pressionando Enter.
Este método fornece um equilíbrio entre a liberação de espaço em disco e a manutenção de algum cache de construção para desempenho. É uma boa prática podar regularmente seu cache de construção para evitar que ele consuma espaço em disco excessivo.
Resumo
Neste laboratório, aprendemos como usar o comando docker builder prune para gerenciar o cache de construção do Docker. Começamos construindo uma imagem Docker simples usando um Dockerfile para entender como o cache de construção é criado e utilizado pelo Docker para acelerar as construções subsequentes. Cada instrução no Dockerfile cria uma camada, e o Docker reutiliza as camadas existentes do cache se a instrução não tiver sido alterada.
Em seguida, exploramos diferentes maneiras de podar o cache de construção. Aprendemos como podar o cache de construção pendente (dangling build cache), que se refere a entradas de cache que não estão mais associadas a nenhuma construção. Também abordamos como podar todo o cache de construção não utilizado, limpando efetivamente todas as entradas de cache que não estão sendo usadas atualmente por nenhuma imagem. Além disso, demonstramos como usar filtros com o comando prune para remover seletivamente o cache de construção com base em critérios específicos. Por fim, exploramos a opção de podar o cache de construção, mantendo o armazenamento associado a certas entradas de cache, o que pode ser útil em cenários específicos.



