deploy(Dockerfile): Ajusta o dockerfile para produção

This commit is contained in:
Keven 2025-12-08 12:10:01 -03:00
parent ffdda4f022
commit 6673e778af

View file

@ -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 \
"]