Suas Builds Docker São Uma Mentira

Pare de culpar o Docker pelos seus tempos de build de 15 minutos. Estas três correções negligenciadas podem reduzir sua espera de minutos para segundos, recuperando seu recurso mais valioso: tempo.

Stork.AI
Hero image for: Suas Builds Docker São Uma Mentira
💡

Resumo / Pontos-chave

Pare de culpar o Docker pelos seus tempos de build de 15 minutos. Estas três correções negligenciadas podem reduzir sua espera de minutos para segundos, recuperando seu recurso mais valioso: tempo.

Aquela Build de 15 Minutos é um Sinal de Alerta

Frustrantemente, esperar de 10 a 15 minutos a cada Docker build é um ponto de dor universal para desenvolvedores em toda a indústria. Sim, isso pode realmente atrasar as coisas, transformando o que deveria ser uma iteração rápida em um trabalho tedioso e demorado. Essa agonia generalizada sustenta a premissa do vídeo amplamente visto da Better Stack, "Your Docker Builds Are Slow… And It’s Your Fault," que confronta diretamente essa realidade frequentemente ignorada por inúmeros engenheiros.

Em vez de culpar a arquitetura inerente do Docker ou exigir hardware mais potente, a verdade desses tempos de build prolongados aponta para um culpado diferente: anti-padrões facilmente identificáveis e retificáveis incorporados em seus Dockerfiles. O próprio Docker é uma ferramenta de conteinerização notavelmente eficiente e poderosa; sua lentidão percebida geralmente surge de erros fundamentais na forma como os desenvolvedores constroem suas instruções de build, em vez de falhas de design intrínsecas. Suas builds são lentas, não devido ao Docker, mas devido a práticas que a maioria negligencia.

Mas você não precisa mais suportar esses ciclos de build prolongados e que esgotam a produtividade. Este artigo desconstruirá sistematicamente as três técnicas centrais que consistentemente transformam uma Docker build que rotineiramente leva de 10 a 15 minutos em uma que é concluída em menos de três minutos. Revelaremos as estratégias que reduzem drasticamente os tempos de build, tornando seu fluxo de trabalho de desenvolvimento significativamente mais responsivo e agradável.

Estas não são hacks complexos, nem exigem a adoção de ferramentas inteiramente novas ou a reformulação de toda a sua base de código existente. Em vez disso, focamos em práticas fundamentais que a maioria dos desenvolvedores simplesmente negligencia, ou talvez nunca aprendeu. Dominar esses métodos simples, mas poderosos, significa inaugurar uma era de iteração significativamente mais rápida, imagens finais dramaticamente menores e um pipeline de desenvolvimento muito mais eficiente, alterando fundamentalmente seu relacionamento com as Docker builds para sempre.

Não é o Docker, é o Seu Contexto Inchado

Ilustração: Não é o Docker, é o Seu Contexto Inchado
Ilustração: Não é o Docker, é o Seu Contexto Inchado

Esperar de 10 a 15 minutos pelas Docker builds frequentemente decorre de um mal-entendido fundamental do build context. Quando você executa `docker build`, o Docker não apenas olha para o seu Dockerfile; ele envia todo o diretório local especificado e todo o seu conteúdo para o daemon do Docker. Essa transferência inicial crítica inclui cada arquivo, independentemente de o seu Dockerfile copiá-lo explicitamente para a imagem final.

Este detalhe frequentemente negligenciado é onde a ineficiência começa, tornando suas builds uma mentira desde o início. O arquivo .dockerignore é sua primeira e mais crítica ferramenta de otimização, instruindo o daemon do Docker quais arquivos e diretórios excluir dessa transferência inicial de contexto. É um mecanismo simples, mas poderoso, para evitar que dados desnecessários saiam da sua máquina local e cheguem ao motor de build.

Ignorar arquivos estranhos reduz drasticamente o tamanho da transferência e o tempo de build. Quase universalmente, você deve incluir: - diretórios `.git`, contendo metadados de controle de versão - pastas `node_modules` ou `venv`, contendo dependências locais - artefatos de build como `dist/`, `build/` ou `target/` - arquivos `.env`, que frequentemente contêm variáveis de ambiente sensíveis - diretórios `logs/`, para logs de tempo de execução - arquivos de configuração de IDE, como `.vscode/` ou `.idea/`

O vídeo da Better Stack, "Your Docker Builds Are Slow… And It’s Your Fault," demonstra vividamente o impacto desta estratégia. Eles reduziram um contexto de build de massivos 500 megabytes para meros 20 megabytes muito rapidamente, implementando um arquivo `.dockerignore` robusto. Esta redução imediata de 25x acelera significativamente a etapa inicial de "Sending build context to Docker daemon", um gargalo frequente para desenvolvedores.

E não se trata apenas da velocidade de transferência. Um contexto menor também aprimora profundamente o layer caching interno do Docker, minimizando as chances de invalidações de cache desnecessárias. Isso significa que builds subsequentes, mesmo com pequenas alterações de código, aproveitam as camadas existentes de forma mais eficaz, acelerando drasticamente o seu ciclo de desenvolvimento. Você ganha desempenho e confiabilidade substanciais simplesmente definindo precisamente o que *não* enviar.

A Arte do Dockerfile `COPY`

A eficiência do Docker depende do layer caching. Cada instrução em um Dockerfile cria uma nova camada na imagem. Se uma instrução e suas entradas permanecerem inalteradas em relação a um build anterior, o Docker reutiliza inteligentemente essa camada em cache, ignorando trabalho redundante e acelerando drasticamente os builds subsequentes.

Muitos desenvolvedores, no entanto, sabotam inadvertidamente este mecanismo com uma única linha, aparentemente inócua: `COPY . .` colocada no início do seu Dockerfile. Este comando copia todo o seu diretório atual – o build context completo – para a imagem de uma só vez. Isso inclui todo o código-fonte, arquivos de configuração e, potencialmente, até artefatos de desenvolvimento irrelevantes.

O problema surge porque qualquer alteração, por menor que seja, em *qualquer* arquivo dentro desse contexto copiado invalida esta camada. Consequentemente, o Docker deve reconstruir esta camada e todas as camadas subsequentes. Isso geralmente significa reinstalar todas as dependências do projeto do zero, mesmo que seu `package.json` ou `requirements.txt` não tenha mudado.

Considere uma abordagem mais estratégica. Em vez de copiar tudo de antemão, primeiro copie apenas o seu dependency manifest – para um projeto Node.js, isso é `package.json` e `package-lock.json`. Esta cópia mínima cria uma camada estável que muda com pouca frequência.

Imediatamente depois, execute o seu comando de instalação de dependências, como `RUN npm install`. Esta etapa cria outra camada distinta. Como apenas o seu manifest foi copiado, a entrada desta camada só muda quando as suas próprias dependências são atualizadas.

Só então, em uma instrução separada, copie o restante do seu código de aplicação com `COPY . .`. Agora, se você modificar uma única linha da sua lógica de aplicação, apenas as camadas finais serão invalidadas. O Docker reutiliza a camada de instalação de dependências estável, ignorando um demorado `npm install`.

Esta otimização não é trivial; ela economiza minutos em cada build. Em vez de esperar que as dependências sejam baixadas e reinstaladas novamente, o Docker aproveita seu cache. Isso transforma uma etapa de instalação de potencialmente 10 minutos em um acerto de cache quase instantâneo, acelerando drasticamente o seu fluxo de trabalho de desenvolvimento.

Por Que Seu `npm install` Demora Uma Eternidade

Esperar de 10 a 15 minutos por um Docker build frequentemente aponta para um principal culpado: a instalação de dependências. Seus comandos `npm install` ou `pip install` frequentemente consomem a maior parte desse tempo, transformando uma atualização de código que seria rápida em um processo de build prolongado. O vídeo da Better Stack destaca essa dor, observando que uma etapa de install típica pode levar três minutos.

Esses gerenciadores de pacotes são inerentemente lentos, sobrecarregados por múltiplos fatores. Eles lidam com a latência de rede ao buscar pacotes de registros remotos, resolvem árvores de dependência intrincadas que exigem ciclos de CPU substanciais e realizam extensa E/S de disco para gravar milhares de arquivos no sistema de arquivos. Esse custo indireto coletivo torna a instalação de dependências uma operação intensiva em recursos.

Mesmo quando você ordena meticulosamente suas instruções `COPY` — colocando `package.json` ou `requirements.txt` antes do código da aplicação — o cache de camadas do Docker muitas vezes é insuficiente para dependências. A maioria dos ambientes de CI/CD opera com runners efêmeros, fornecendo um ambiente limpo para cada build. Isso significa que as camadas de dependência anteriores raramente são reutilizadas, forçando um novo download e reinstalação completos a cada build.

Você confronta esse problema recorrente diretamente com o moderno motor de build do Docker, o BuildKit. Este builder avançado introduz um recurso transformador: montagens de cache dedicadas. Essas montagens permitem o cache persistente e isolado para instalações de dependências, prevenindo downloads e instalações redundantes entre builds e reduzindo drasticamente aquela instalação de três minutos para meros segundos.

O Milagre da Montagem de Cache do BuildKit

Ilustração: O Milagre da Montagem de Cache do BuildKit
Ilustração: O Milagre da Montagem de Cache do BuildKit

Sua etapa de `npm install` muitas vezes parece uma eternidade, um grande gargalo nos builds do Docker. Embora o cache de camadas ajude, ele tem dificuldades com a natureza dinâmica e externa das dependências do gerenciador de pacotes. O BuildKit, o moderno motor de build do Docker e o padrão para instalações contemporâneas do Docker, oferece uma solução poderosa que transforma radicalmente essa experiência.

O BuildKit introduz um recurso revolucionário: `RUN --mount=type=cache`. Esta diretiva fornece um diretório de cache persistente e dedicado dentro do ambiente de build. Ao contrário das instruções padrão do Dockerfile, os arquivos gravados em uma montagem de cache não se tornam parte da camada final da imagem. Em vez disso, eles persistem em builds subsequentes, atuando como um repositório de alta velocidade para ativos frequentemente baixados.

Imagine pular o processo árduo de baixar novamente gigabytes de módulos Node.js, pacotes Python ou crates Rust a cada reconstrução. A montagem de cache torna isso uma realidade. Ela visa diretórios específicos onde os gerenciadores de pacotes armazenam seus artefatos baixados, garantindo que estejam disponíveis instantaneamente para instalações subsequentes.

Considere este trecho otimizado do Dockerfile: `RUN --mount=type=cache,target=/root/.npm npm install`

Esta instrução informa ao BuildKit para montar um volume de cache em `/root/.npm`, o local de cache padrão para o `npm`. Quando o `npm install` é executado, ele primeiro verifica este diretório montado. Se as dependências já estiverem presentes de um build anterior, o `npm` as reutiliza, ignorando solicitações de rede e longos tempos de download. Isso acelera dramaticamente a fase de resolução de dependências.

A distinção do cache de camadas tradicional do Docker é crucial. O cache de camadas reutiliza a saída de uma instrução inteira se suas entradas (como a própria instrução do Dockerfile ou arquivos copiados) permanecerem inalteradas. Uma montagem de cache, por outro lado, fornece um volume persistente e gravável especificamente para artefatos de tempo de build que não devem fazer parte da imagem final. Isso a torna ideal para gerenciadores de pacotes, que baixam e armazenam inúmeros arquivos que não são diretamente código de aplicação.

O vídeo recente da Better Stack destaca o impacto profundo desta técnica, observando uma etapa de instalação de dependências que caiu de três minutos para aproximadamente oito segundos. Essa melhoria massiva decorre diretamente do aproveitamento do cache inteligente do BuildKit. Isso permite que os desenvolvedores mantenham ciclos de iteração rápidos, libertando-os da frustração de Esperar por instalações lentas de dependências. Os cache mounts do BuildKit representam uma mudança fundamental, indo além das limitações da simples reutilização de camadas para fornecer um cache verdadeiramente inteligente e persistente para ambientes de build complexos.

Reduzindo Instalações de 3 Minutos para 8 Segundos

Uma única mudança transforma a instalação de dependências de uma provação de três minutos em um sprint de oito segundos. Essa redução dramática, destacada pela Better Stack, é cortesia dos BuildKit cache mounts. Para projetos com muitas bibliotecas externas, essa otimização é frequentemente o acelerador mais significativo que você pode implementar.

Anteriormente, um comando padrão `RUN npm install` ou `RUN pip install` dentro do seu Dockerfile significava que cada build, mesmo com pequenas alterações de código, acionava um novo download e instalação completa de todas as dependências do projeto. O mecanismo de cache de camadas do Docker, embora poderoso, não conseguia persistir os caches do gerenciador de pacotes entre os builds, levando a requisições de rede e I/O de disco redundantes.

O BuildKit resolve isso introduzindo a flag `--mount=type=cache` para as instruções `RUN`. Isso cria um diretório de cache dedicado e persistente no host de build, acessível apenas durante a etapa de build. Os gerenciadores de pacotes então usam este local, armazenando pacotes baixados e artefatos de build para reutilização futura em builds.

Considere uma aplicação Node.js: em vez de `RUN npm install`, você usa `RUN --mount=type=cache,target=/root/.npm npm install --cache /tmp/npm-cache`. Para Python, `RUN --mount=type=cache,target=/root/.cache/pip pip install --cache-dir /tmp/pip-cache` alcança um efeito similar. O `target` especifica o local do cache *dentro* do container durante o build.

Esta estratégia se estende amplamente por vários ecossistemas de programação. Ela se aplica a: - cache do `pip` para Python - diretório `.m2` do Maven para Java - `go mod download` para Go - RubyGems para projetos Ruby O princípio central permanece consistente: direcionar o gerenciador de pacotes para armazenar seus ativos baixados em um volume de cache gerenciado pelo BuildKit.

O impacto é profundo: downloads e instalações de dependências, antes um gargalo primário, tornam-se quase instantâneos após a execução inicial. Essa otimização "que mudou tudo", como a Better Stack a descreve apropriadamente, remodela fundamentalmente a economia do desenvolvimento iterativo, libertando os desenvolvedores de esperas frustrantemente longas.

Sua Imagem Final é Grande Demais

Além da velocidade de build, uma imagem final inchada apresenta outro gargalo crítico de desempenho. Imagens Docker frequentemente aumentam para centenas de megabytes, às vezes até gigabytes, carregando bagagem desnecessária para produção. Isso se traduz diretamente em implantações mais lentas e custos operacionais mais altos.

Imagens grandes aumentam significativamente o tempo necessário para enviar para registros de contêineres e baixar para destinos de implantação. Imagine baixar uma imagem de 1GB versus uma de 50MB em uma frota de servidores – a diferença na velocidade de implantação é substancial. Além disso, o aumento do consumo de armazenamento em registros e máquinas host inflaciona as despesas de infraestrutura.

Criticamente, uma imagem maior também expande sua superfície de ataque de segurança. Cada arquivo, biblioteca ou ferramenta de desenvolvimento adicional incluído potencialmente introduz novas vulnerabilidades. Compiladores, SDKs, dependências de desenvolvimento como frameworks de teste e artefatos de build temporários frequentemente permanecem em imagens de produção, apesar de não terem nenhum papel na funcionalidade de tempo de execução da aplicação.

A solução reside num princípio fundamental: separar o ambiente de build do ambiente de runtime. Você precisa de um ambiente rico para compilar seu código, resolver dependências e gerar executáveis. Mas para o deployment, o objetivo é uma imagem mínima contendo apenas a aplicação e suas necessidades absolutas de runtime. Esta distinção estratégica forma a base para a criação de imagens de contêiner enxutas, seguras e eficientes.

A Dieta de Multi-Stage Build

Ilustração: A Dieta de Multi-Stage Build
Ilustração: A Dieta de Multi-Stage Build

Após abordar os tempos de build lentos, a atenção deve se voltar para outra otimização crítica: o tamanho final da imagem. Muitos desenvolvedores criam imagens Docker massivas, incluindo inadvertidamente gigabytes de dependências de build-time, arquivos temporários e ferramentas de desenvolvimento que não têm lugar num ambiente de produção. Este inchaço leva a deployments mais lentos, custos de armazenamento aumentados e uma superfície de ataque maior.

Entre na dieta de multi-stage build, um padrão poderoso que reduz drasticamente o tamanho das suas imagens Docker finais. Esta abordagem separa o processo de compilação e instalação de dependências do ambiente de runtime final. Você aproveita a capacidade do Docker de usar artefatos de um build stage em outro, descartando todo o resto.

O processo começa com um estágio "builder". Aqui, uma imagem base completa como `FROM node:18 as builder` fornece todas as ferramentas necessárias para compilação e instalação de dependências. Dentro deste estágio, você copia `package*.json`, executa `npm install` (incluindo `devDependencies`), copia seu código-fonte e executa seu comando de build, como `npm run build`. Este estágio contém todos os arquivos temporários e ferramentas de desenvolvimento necessários para produzir os artefatos da sua aplicação.

Em seguida, vem o estágio final e enxuto. Este estágio tipicamente usa uma imagem base mínima, como `FROM node:18-alpine`, conhecida por sua pegada significativamente menor em comparação com suas contrapartes completas. Esta imagem base inclui apenas o que é absolutamente essencial para sua aplicação rodar em produção, removendo bibliotecas de sistema e utilitários desnecessários.

A mágica acontece com o comando `COPY --from=builder /app/dist /app`. Esta instrução crucial transfere seletivamente *apenas* os artefatos da aplicação compilada — como sua pasta `/app/dist` — do estágio "builder" para a imagem final mínima. Todo o resto do estágio builder, incluindo `node_modules`, compilers e build caches, é deixado para trás, nunca chegando à imagem de produção.

Considere este exemplo de Dockerfile:

```dockerfile # Estágio 1: Build da aplicação FROM node:18 as builder WORKDIR /app # Copia arquivos de pacote para aproveitar o cache de camada COPY package*.json ./ # Instala todas as dependências RUN npm install # Copia o código-fonte e faz o build COPY . . RUN npm run build

# Estágio 2: Cria a imagem final e enxuta FROM node:18-alpine WORKDIR /app # Copia APENAS a saída do build do estágio 'builder' COPY --from=builder /app/dist ./dist # Define o comando para executar sua aplicação CMD ["node", "./dist/index.js"] ```

Esta abordagem multi-stage garante que sua imagem de produção contenha apenas sua aplicação e suas dependências essenciais de runtime. Suas imagens Docker encolhem de centenas de megabytes, ou até gigabytes, para dezenas de megabytes, espelhando os ganhos de eficiência vistos com os cache mounts do BuildKit para velocidade de build. Isso leva a deployments significativamente mais rápidos, menor consumo de recursos e uma pegada de segurança drasticamente reduzida.

Além do Básico: Higiene Moderna do Docker

Instruções `COPY` otimizadas, montagens de cache do BuildKit e builds multi-stage proporcionam ganhos significativos na velocidade de build do Docker e no tamanho final da imagem. No entanto, a higiene moderna do Docker vai muito além dessas otimizações fundamentais, exigindo uma abordagem proativa para segurança e manutenibilidade a longo prazo. A verdadeira conteinerização profissional integra essas práticas essenciais desde o início para construir sistemas robustos e prontos para produção.

Fundamental para um contêiner enxuto e seguro é a escolha deliberada da imagem base. Os desenvolvedores estão cada vez mais optando por opções mínimas, como `alpine` ou `slim-bullseye` do Debian, em vez de distribuições maiores e de uso geral. Essas imagens reduzem drasticamente a superfície de ataque ao excluir utilitários de sistema, bibliotecas e pacotes desnecessários, o que se traduz diretamente em menos potenciais Common Vulnerabilities and Exposures (CVEs) e downloads de imagem mais rápidos. O Alpine, por exemplo, utiliza o Musl libc por sua pequena pegada, enquanto o `slim-bullseye` poda inteligentemente componentes estranhos de uma base Debian estável.

Além de simplesmente minimizar o tamanho da imagem, adote posturas de segurança robustas dentro do próprio contêiner. Executar sua aplicação como um usuário não-root é uma prática recomendada crítica. Instruções como `USER nobody` ou a criação de um usuário e grupo dedicados e sem privilégios dentro do Dockerfile evitam potencial escalonamento de privilégios. Se um invasor comprometer a aplicação, o impacto é severamente limitado, pois o processo não possui acesso root ao sistema host ou a outros contêineres.

Manter esse padrão elevado exige vigilância contínua, especialmente dentro de pipelines de CI/CD automatizados. Ferramentas proativas de varredura de segurança como Docker Scout e Trivy tornam-se indispensáveis, analisando as camadas da imagem em busca de vulnerabilidades conhecidas, configurações incorretas e componentes desatualizados. A integração de tais scanners garante que as verificações de segurança sejam "deslocadas para a esquerda" (shifted left), detectando problemas no início do ciclo de vida de desenvolvimento e garantindo que as imagens Docker permaneçam resilientes durante toda a sua vida útil operacional.

Sua Nova Realidade: O Build de 3 Minutos

Agora você possui as estratégias para transformar fundamentalmente seu pipeline de build do Docker. Você não precisa mais suportar processos lentos e inchados. Você entende o impacto crítico de otimizar seu contexto de build com um arquivo `.dockerignore` e uma ordem `COPY` estratégica, garantindo que apenas os arquivos essenciais cheguem ao daemon do Docker. Isso por si só pode reduzir as transferências de 500 megabytes para meros 20.

Você viu o poder das montagens de cache do BuildKit, que eliminam downloads redundantes de dependências. Essa inovação reduz drasticamente os tempos de instalação de dependências, transformando um `npm install` de três minutos em uma operação de apenas oito segundos. Sim, essa única otimização frequentemente marca o ganho de desempenho mais dramático para projetos com muitas dependências.

Finalmente, você dominou os builds multi-stage, uma técnica crucial para criar imagens enxutas e prontas para produção. Ao separar as dependências de tempo de build do ambiente de execução final, você reduz drasticamente o tamanho final das imagens, melhorando a velocidade de implantação e diminuindo a superfície de ataque. E simplifica a manutenção.

Combinados, esses três princípios centrais entregam resultados impressionantes. Builds que antes o deixavam esperando de 10 a 15 minutos agora são rotineiramente concluídos em menos de três. O impacto cumulativo é inegável, tornando "Seus Builds Docker São Lentos" uma relíquia do passado para você.

Este não é o fim da jornada; é um novo e robusto começo. Essas otimizações locais do Dockerfile estabelecem a base para soluções avançadas e baseadas em equipe, como o Docker Build Cloud, que aceleram ainda mais os ciclos de desenvolvimento colaborativo em toda a sua organização.

Em vez de aceitar builds lentos, assuma o controle. Você tem o conhecimento e as ferramentas para implementar mudanças imediatas e impactantes. Mas, não acredite apenas na nossa palavra. Aplique estas três técnicas ao seu projeto Docker mais lento esta semana. Meça a diferença nos tempos de build e nos tamanhos das imagens. Você descobrirá que "A Culpa é Sua" foi um mal-entendido, substituído por um desenvolvimento eficiente e rápido.

Perguntas Frequentes

Qual é o maior erro que causa builds lentos no Docker?

O erro mais comum é copiar todo o código da aplicação para a imagem Docker antes de instalar as dependências. Isso quebra o cache de camadas do Docker, forçando uma longa reinstalação de dependências a cada alteração de código.

Como um multi-stage build torna as imagens Docker menores?

Um multi-stage build usa um estágio 'builder' temporário com todas as ferramentas e dependências necessárias para compilar ou construir a aplicação. A imagem final, menor, é então criada copiando apenas os artefatos compilados essenciais para uma imagem base limpa e mínima, deixando todas as ferramentas de build para trás.

O que é BuildKit e por que é mais rápido?

BuildKit é o motor de build moderno do Docker. É mais rápido devido a recursos como execução paralela de estágios, pulo de estágios não utilizados e cache avançado, como cache mounts que persistem caches de dependência entre builds, acelerando drasticamente as etapas de instalação.

Por que um arquivo .dockerignore é tão importante?

Um arquivo .dockerignore impede que arquivos desnecessários (como .git, node_modules, logs locais) sejam enviados ao daemon Docker como parte do 'build context'. Isso reduz drasticamente o tamanho do contexto, acelerando a etapa inicial do build e impedindo que arquivos sensíveis sejam incluídos na imagem.

Perguntas frequentes

Qual é o maior erro que causa builds lentos no Docker?
O erro mais comum é copiar todo o código da aplicação para a imagem Docker antes de instalar as dependências. Isso quebra o cache de camadas do Docker, forçando uma longa reinstalação de dependências a cada alteração de código.
Como um multi-stage build torna as imagens Docker menores?
Um multi-stage build usa um estágio 'builder' temporário com todas as ferramentas e dependências necessárias para compilar ou construir a aplicação. A imagem final, menor, é então criada copiando apenas os artefatos compilados essenciais para uma imagem base limpa e mínima, deixando todas as ferramentas de build para trás.
O que é BuildKit e por que é mais rápido?
BuildKit é o motor de build moderno do Docker. É mais rápido devido a recursos como execução paralela de estágios, pulo de estágios não utilizados e cache avançado, como cache mounts que persistem caches de dependência entre builds, acelerando drasticamente as etapas de instalação.
Por que um arquivo .dockerignore é tão importante?
Um arquivo .dockerignore impede que arquivos desnecessários sejam enviados ao daemon Docker como parte do 'build context'. Isso reduz drasticamente o tamanho do contexto, acelerando a etapa inicial do build e impedindo que arquivos sensíveis sejam incluídos na imagem.
🚀Descubra mais

Fique à frente da curva da IA

Descubra as melhores ferramentas de IA, agentes e servidores MCP selecionados pela Stork.AI.

Voltar a todas as publicações