diff --git a/Dockerfile b/Dockerfile index 8826883..a0e0031 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,26 +1,61 @@ -# Usa a imagem oficial do Python -FROM python:3.12-slim +# ============================== +# STAGE 1 – Build das dependências +# ============================== +FROM python:3.12-slim AS builder -# Define diretório de trabalho no container WORKDIR /app -# Copia o arquivo de dependências +# Copia apenas requirements para cache eficiente COPY requirements.txt . -# Instala dependências no sistema e no Python -RUN apt-get update && apt-get install -y \ - gcc libffi-dev libssl-dev python3-dev firebird-dev \ +# 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 \ && pip install --upgrade pip \ - && pip install --no-cache-dir -r requirements.txt \ - && apt-get remove -y gcc \ - && apt-get autoremove -y \ - && rm -rf /var/lib/apt/lists/* + && 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/* -# Copia o restante do projeto para o container +# ============================== +# 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 . . -# Expõe a porta padrão do Uvicorn/FastAPI +# 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 para iniciar o servidor -CMD ["sh", "-c", "uvicorn main:app --host 0.0.0.0 --port 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 \ +"]