O Que É um Dockerfile? A Receita para Construir uma Image
Um Dockerfile é uma lista de instruções em texto simples que diz ao Docker, passo a passo, como montar uma image.
Se uma image é o template, o Dockerfile é a receita que a produz. Cada instrução roda em ordem e, quando altera o filesystem, adiciona uma camada. Saber como as instruções comuns se comportam é a diferença entre um build cacheado de 10 segundos e um de 10 minutos.
As instruções que você mais usa
- FROM - a base image sobre a qual construir.
- RUN - executa um comando no momento do build (instalações, compilações).
- COPY / ADD - traz arquivos do seu build context para dentro da image.
- WORKDIR, ENV - define o diretório de trabalho e o ambiente.
- CMD / ENTRYPOINT - o que roda quando o container inicia.
Um exemplo mínimo
Uma pequena aplicação Node poderia ser:
FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
CMD ["node", "server.js"]
A ordem é deliberada - veja o cache abaixo.
A ordem importa para o cache
O Docker faz cache de cada camada e a reutiliza se a instrução e suas entradas não mudaram. Ao copiar package*.json e instalar as dependências antes de copiar o resto do código-fonte, você só reinstala quando as dependências mudam - não a cada edição de código.
CMD vs ENTRYPOINT
ENTRYPOINT define o executável que sempre roda; CMD define os argumentos padrão que quem chama pode sobrescrever. Muitas images usam ENTRYPOINT para o binário e CMD para suas flags padrão.
Construindo a partir de um Dockerfile no CI
Um pipeline normalmente roda docker build sobre o Dockerfile e então faz o push do resultado. O tempo de build é dominado pelos cache hits e pelas instalações de dependências, então um runner com um cache aquecido vence. Runners gerenciados (Latchkey) preservam os caches de camadas entre jobs para manter esses builds rápidos.
Principais conclusões
- Um Dockerfile é uma receita ordenada; cada instrução que altera o filesystem é uma camada.
- Copie e instale as dependências antes do código-fonte para maximizar os cache hits.
- ENTRYPOINT define o executável; CMD define argumentos padrão que podem ser sobrescritos.