Exemplo simples de API FastAPI com Docker multi-stage para produção e desenvolvimento.
.
├─ app/
│ └─ main.py
├─ requirements.txt
├─ requirements-dev.txt
├─ Dockerfile
├─ compose.yaml # dev
├─ compose.prod.yaml # prod
└─ .dockerignore
- Docker
- Docker Compose
Hot-reload com Uvicorn. Usa o estágio dev do Dockerfile e volume do código.
# subir
docker compose up --build -d
# acessar
curl http://localhost:8008/Imagem enxuta com Gunicorn + UvicornWorker. Usa o estágio final.
# subir
docker compose -f compose.prod.yaml up --build -d
# acessar
curl http://localhost:8000/APP_ENV- dev:
development - prod:
production
- dev:
GUNICORN_WORKERS(prod) – padrão4GUNICORN_BIND(prod) – padrão0.0.0.0:8000GUNICORN_TIMEOUT(prod) – padrão60
- base: Python 3.11-slim + ajustes básicos
- builder: instala
requirements.txtem/opt/venv - final: imagem de produção minimal, copia apenas o venv e a app
- dev: herda do builder os pacotes e instala apenas extras do
requirements-dev.txt
# listar tamanhos
docker image ls --format 'table {{.Repository}}\t{{.Tag}}\t{{.Size}}' | grep buildkit-example
# camadas e tamanho em bytes
docker image inspect buildkit-example:dev --format 'dev -> Size={{.Size}} Layers={{len .RootFS.Layers}}'
docker image inspect buildkit-example:prod --format 'prod -> Size={{.Size}} Layers={{len .RootFS.Layers}}'
# histórico de camadas
docker history buildkit-example:prod