# ============== Stage 1: Builder ============== FROM python:3.12-slim AS builder WORKDIR /app ENV PYTHONUNBUFFERED=1 \ PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/ \ PIP_TRUSTED_HOST=mirrors.aliyun.com # Install build dependencies RUN apt-get update && apt-get install -y --no-install-recommends \ gcc \ libpq-dev \ && rm -rf /var/lib/apt/lists/* # Install Python dependencies COPY requirements.txt ./ RUN python -m pip install --upgrade pip setuptools wheel && \ pip install --no-cache-dir --default-timeout=120 --retries 10 -r requirements.txt # ============== Stage 2: Production ============== FROM python:3.12-slim AS production WORKDIR /app ENV PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PIP_NO_CACHE_DIR=1 # Install runtime dependencies only RUN apt-get update && apt-get install -y --no-install-recommends \ libpq5 \ && rm -rf /var/lib/apt/lists/* # Copy installed packages from builder COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages COPY --from=builder /usr/local/bin /usr/local/bin # Copy application code ENV PYTHONPATH=/app COPY apps/api /app/apps/api COPY packages /app/packages COPY scripts /app/scripts COPY alembic /app/alembic COPY alembic.ini /app/alembic.ini WORKDIR /app/apps/api EXPOSE 8000 # Run as non-root user for security RUN useradd --create-home --shell /bin/bash appuser && \ chown -R appuser:appuser /app USER appuser CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]