# Multi-stage build for Python API # Stage 1: Builder FROM python:3.10-slim as builder # Set working directory WORKDIR /build # Install system dependencies RUN apt-get update && apt-get install -y --no-install-recommends \ gcc \ g++ \ make \ libpq-dev \ libssl-dev \ libffi-dev \ && rm -rf /var/lib/apt/lists/* # Copy requirements COPY requirements.txt . # Create virtual environment and install dependencies RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" RUN pip install --no-cache-dir --upgrade pip setuptools wheel && \ pip install --no-cache-dir -r requirements.txt # Stage 2: Runtime FROM python:3.10-slim # Set working directory WORKDIR /app # Install runtime dependencies only RUN apt-get update && apt-get install -y --no-install-recommends \ libpq5 \ curl \ && rm -rf /var/lib/apt/lists/* # Copy virtual environment from builder COPY --from=builder /opt/venv /opt/venv # Set environment variables ENV PATH="/opt/venv/bin:$PATH" \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ FLASK_APP=run.py # Create non-root user RUN useradd -m -u 1000 appuser && \ mkdir -p /app/logs && \ chown -R appuser:appuser /app # Copy application code COPY --chown=appuser:appuser . /app/ # Switch to non-root user USER appuser # Expose port EXPOSE 5000 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD curl -f http://localhost:5000/health || exit 1 # Default command CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--workers", "4", "--threads", "2", "--timeout", "120", "--worker-class", "gevent", "--access-logfile", "-", "--error-logfile", "-", "run:app"]