Agentic-RagBot / Dockerfile
T0X1N's picture
chore: implement true multi-stage docker build to reduce image size
7d110d0
# ===========================================================================
# MediGuard AI β€” Multi-Stage Dockerfile
# ===========================================================================
# Supports both HuggingFace Spaces deployment and Docker Compose production.
#
# Usage:
# HuggingFace Spaces: docker build -t mediguard .
# Production API: docker build -t mediguard --target production .
# ===========================================================================
# ---------------------------------------------------------------------------
# Stage 1: Builder stage β€” compiles dependencies
# ---------------------------------------------------------------------------
FROM python:3.11-slim AS builder
# Python settings
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
PIP_NO_CACHE_DIR=1 \
PIP_DISABLE_PIP_VERSION_CHECK=1
WORKDIR /app
# System dependencies for building packages
# These will NOT be included in the final image
RUN apt-get update && \
apt-get install -y --no-install-recommends \
build-essential \
git \
&& rm -rf /var/lib/apt/lists/*
# Create virtual environment
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
# Copy requirements
COPY requirements.txt ./requirements.txt
COPY huggingface/requirements.txt ./huggingface-requirements.txt
# Install dependencies into virtual environment
RUN pip install --upgrade pip && \
pip install -r requirements.txt && \
pip install -r huggingface-requirements.txt
# ---------------------------------------------------------------------------
# Stage 2: Final runtime base β€” strictly required files only
# ---------------------------------------------------------------------------
FROM python:3.11-slim AS base
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
WORKDIR /app
# Install minimal runtime dependencies (curl for healthcheck)
# We don't need build-essential or git here
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
&& rm -rf /var/lib/apt/lists/*
# Copy virtual environment from builder stage
COPY --from=builder /opt/venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
# Copy the entire project source code
COPY . .
# Create necessary directories
RUN mkdir -p data/medical_pdfs data/vector_stores data/chat_reports
# ---------------------------------------------------------------------------
# Production stage β€” FastAPI server with uvicorn
# ---------------------------------------------------------------------------
FROM base AS production
# Production settings
ENV API_PORT=8000 \
WORKERS=4
# Create non-root user
RUN useradd -m -u 1000 appuser && \
chown -R appuser:appuser /app
USER appuser
ENV HOME=/home/appuser
EXPOSE 8000
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
CMD curl -sf http://localhost:8000/health || exit 1
# Run FastAPI with uvicorn
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
# ---------------------------------------------------------------------------
# HuggingFace stage β€” Gradio app (default)
# ---------------------------------------------------------------------------
FROM base AS huggingface
# HuggingFace Spaces runs on port 7860
ENV GRADIO_SERVER_NAME="0.0.0.0" \
GRADIO_SERVER_PORT=7860 \
EMBEDDING_PROVIDER=huggingface
# Create non-root user (HF Spaces requirement)
RUN useradd -m -u 1000 user && \
chown -R user:user /app
USER user
ENV HOME=/home/user
EXPOSE 7860
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
CMD curl -sf http://localhost:7860/ || exit 1
# Launch Gradio app
CMD ["python", "huggingface/app.py"]
# Default to HuggingFace stage for HF Spaces (no target specified)
FROM huggingface