# ============================== # STAGE 1 – Build das dependências # ============================== FROM python:3.12-slim AS builder WORKDIR /app # Copia apenas requirements para cache eficiente COPY requirements.txt . # Instala dependências necessárias apenas para build RUN apt-get update && apt-get install -y --no-install-recommends \ gcc libffi-dev libssl-dev python3-dev firebird-dev build-essential curl nano \ && pip install --upgrade pip \ && pip install --no-cache-dir --prefix=/install -r requirements.txt \ && apt-get purge -y gcc build-essential python3-dev \ && apt-get autoremove -y && rm -rf /var/lib/apt/lists/* # ============================== # STAGE 2 – Runtime (produção) # ============================== FROM python:3.12-slim AS runtime # Define diretório de trabalho WORKDIR /app # Copia dependências instaladas do estágio builder COPY --from=builder /install /usr/local # Copia o restante do código COPY . . # Adiciona um usuário não-root para segurança RUN addgroup --system app && adduser --system --ingroup app appuser USER appuser # Define timezone e ambiente ENV TZ=America/Sao_Paulo \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ UVICORN_WORKERS=4 \ UVICORN_PORT=8000 \ UVICORN_HOST=0.0.0.0 # Expõe a porta de aplicação EXPOSE 8000 # ============================== # Comando de inicialização (Gunicorn + Uvicorn Workers) # ============================== CMD ["sh", "-c", "\ gunicorn main:app \ --worker-class uvicorn.workers.UvicornWorker \ --workers ${UVICORN_WORKERS:-4} \ --bind ${UVICORN_HOST:-0.0.0.0}:${UVICORN_PORT:-8000} \ --timeout 60 \ --keep-alive 10 \ --access-logfile '-' \ --error-logfile '-' \ --graceful-timeout 30 \ "]