DEV Community

Isaias Velasquez
Isaias Velasquez

Posted on

How to criar Dockerfiles eficientes com multi stage builds

Multi stage builds sao uma das melhores features do Docker para manter imagens pequenas e organizadas. Vou mostrar como aplicar isso em um projeto Python real.

Crie um arquivo app.py simples:

# app.py
def main():
    print("Hello from a multi stage build")

if __name__ == "__main__":
    main()
Enter fullscreen mode Exit fullscreen mode

Agora crie o Dockerfile sem multi stage:

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
Enter fullscreen mode Exit fullscreen mode

Essa imagem inclui o pip, o cache do pip e ferramentas de build que nao precisamos em producao. O resultado e uma imagem maior que o necessario.

Com multi stage builds separamos o ambiente de build do ambiente final. Veja o mesmo Dockerfile com dois stages:

FROM python:3.12-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

FROM python:3.12-slim
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
COPY . .
CMD ["python", "app.py"]
Enter fullscreen mode Exit fullscreen mode

O primeiro stage instala as dependencias. O segundo stage copia so o que importa. O resultado e uma imagem final muito menor.

Para construir e ver o tamanho:

docker build -t minha-app .
docker images | grep minha-app
Enter fullscreen mode Exit fullscreen mode

Para linguagens compiladas como Go o ganho e ainda maior. Veja um exemplo com uma aplicacao Go:

FROM golang:1.23 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /app/server

FROM scratch
COPY --from=builder /app/server /server
CMD ["/server"]
Enter fullscreen mode Exit fullscreen mode

A imagem final comeca do zero (scratch). Nao tem shell, sistema operacional, nem ferramentas de build. So o binario compilado.

Uma dica pratica: sempre nomeie seus stages com AS para facilitar a leitura. Use nomes como builder, test, ou dev. Isso ajuda a saber o que cada stage faz sem precisar contar linhas.

That's all for now.
Thanks for reading!

Top comments (0)