81 lines
2.6 KiB
Docker
81 lines
2.6 KiB
Docker
# ==============================
|
||
# 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 todo o código do projeto
|
||
COPY . .
|
||
|
||
# Corrige a criação/cópia do arquivo de configuração Firebird
|
||
RUN mkdir -p /app/config/database && \
|
||
if [ -f /app/config/database/firebird.json ]; then \
|
||
echo "✅ Arquivo config/database/firebird.json já existe, mantendo..."; \
|
||
else \
|
||
echo "⚠️ Arquivo config/database/firebird.json não encontrado — criando padrão..."; \
|
||
echo '{ \
|
||
"host": "localhost", \
|
||
"port": 3050, \
|
||
"database": "/database/BASE.FDB", \
|
||
"user": "SYSDBA", \
|
||
"password": "302b3c" \
|
||
}' > /app/config/database/firebird.json; \
|
||
fi
|
||
|
||
# Define timezone e variáveis de ambiente padrão
|
||
ENV TZ=America/Sao_Paulo \
|
||
PYTHONUNBUFFERED=1 \
|
||
PYTHONDONTWRITEBYTECODE=1 \
|
||
UVICORN_WORKERS=4 \
|
||
UVICORN_PORT=8000 \
|
||
UVICORN_HOST=0.0.0.0 \
|
||
GUNICORN_CMD_ARGS="--log-level info --timeout 60 --graceful-timeout 30 --keep-alive 10"
|
||
|
||
# Instala utilitários para debug e health checks
|
||
RUN apt-get update && apt-get install -y --no-install-recommends curl nano \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
# Expõe a porta padrão do app
|
||
EXPOSE 8000
|
||
|
||
# ==============================
|
||
# HEALTHCHECK automático
|
||
# ==============================
|
||
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
||
CMD curl -f http://localhost:8000/health || exit 1
|
||
|
||
# ==============================
|
||
# 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} \
|
||
--access-logfile '-' \
|
||
--error-logfile '-' \
|
||
"]
|