# Multi-stage build for optimized production image FROM python:3.11-slim as builder # Set environment variables ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 # Install system dependencies RUN apt-get update && apt-get install -y \ build-essential \ libpq-dev \ curl \ && rm -rf /var/lib/apt/lists/* # Create virtual environment RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" # Copy requirements and install Python dependencies COPY requirements.txt /tmp/ RUN pip install --upgrade pip && \ pip install -r /tmp/requirements.txt # Production stage FROM python:3.11-slim as production # Set environment variables ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ FLASK_ENV=production \ PATH="/opt/venv/bin:$PATH" # Install runtime dependencies RUN apt-get update && apt-get install -y \ libpq5 \ curl \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean # Create non-root user RUN groupadd -r rateright && useradd -r -g rateright rateright # Copy virtual environment from builder stage COPY --from=builder /opt/venv /opt/venv # Set work directory WORKDIR /app # Copy application code COPY --chown=rateright:rateright . . # Create necessary directories RUN mkdir -p /app/logs /app/uploads /app/instance && \ chown -R rateright:rateright /app # Switch to non-root user USER rateright # Expose port EXPOSE 8080 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD curl -f http://localhost:8080/api/health || exit 1 # Run gunicorn with optimized settings CMD ["gunicorn", \ "--bind", "0.0.0.0:8080", \ "--workers", "4", \ "--timeout", "120", \ "--keep-alive", "2", \ "--log-level", "info", \ "--access-logfile", "-", \ "--error-logfile", "-", \ "--capture-output", \ "run:app"]