# =========================================== # Production Dockerfile # Multi-stage build for smaller image # =========================================== # Stage 1: Build FROM python:3.11-slim as builder WORKDIR /app # Install build dependencies RUN apt-get update && apt-get install -y --no-install-recommends \ gcc \ libpq-dev \ && rm -rf /var/lib/apt/lists/* # Create virtualenv RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" # Install Python dependencies COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Stage 2: Production FROM python:3.11-slim WORKDIR /app # Install runtime dependencies only RUN apt-get update && apt-get install -y --no-install-recommends \ libpq5 \ chromium \ chromium-driver \ fonts-liberation \ libasound2 \ libatk-bridge2.0-0 \ libatk1.0-0 \ libatspi2.0-0 \ libcups2 \ libdbus-1-3 \ libdrm2 \ libgbm1 \ libgtk-3-0 \ libnspr4 \ libnss3 \ libxcomposite1 \ libxdamage1 \ libxfixes3 \ libxkbcommon0 \ libxrandr2 \ xdg-utils \ curl \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean # Copy virtualenv from builder COPY --from=builder /opt/venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" # Create non-root user for security RUN groupadd -r appgroup && useradd -r -g appgroup appuser # Copy application code COPY --chown=appuser:appgroup . . # Create directories RUN mkdir -p /app/uploads /app/logs \ && chown -R appuser:appgroup /app/uploads /app/logs # Environment variables ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 ENV CHROME_BIN=/usr/bin/chromium ENV CHROMIUM_FLAGS="--no-sandbox --disable-dev-shm-usage" # Switch to non-root user USER appuser # Expose port EXPOSE 8000 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8000/api/health || exit 1 # Default command (can be overridden) CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]