# Multi-stage build for Medical Diagnosis AI # Stage 1: Build React frontend with Node.js # Stage 2: Python backend serving both API and static files # ============================================================ # Stage 1: Build React Frontend # ============================================================ FROM node:18-slim AS frontend-builder WORKDIR /build/frontend # Copy frontend source code COPY frontend/package*.json ./ RUN npm install --frozen-lockfile # Copy frontend source COPY frontend/ . # Build the frontend (creates dist/ folder) RUN npm run build # ============================================================ # Stage 2: Python Backend with Static File Serving # ============================================================ FROM python:3.10-slim # Set metadata LABEL maintainer="Medical Diagnosis AI Team" LABEL description="Medical Diagnosis AI - Full Stack Application" # Set environment variables ENV PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PIP_NO_CACHE_DIR=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 # Create non-root user with UID 1000 (Hugging Face Spaces requirement) RUN groupadd -r user && useradd -r -u 1000 -g user user # Set working directory WORKDIR /home/user/app # Copy requirements and install Python dependencies COPY requirements.txt . RUN pip install --upgrade pip && \ pip install -r requirements.txt # Install curl for health checks RUN apt-get update && \ apt-get install -y --no-install-recommends curl && \ rm -rf /var/lib/apt/lists/* # Copy backend application code COPY app/ ./app/ COPY server.py . # Copy the ML model (CRITICAL - needed for disease predictions) COPY models/ ./models/ # Create frontend dist directory and copy built frontend from Stage 1 RUN mkdir -p frontend COPY --from=frontend-builder /build/frontend/dist ./frontend/dist # Change ownership of all files to the non-root user RUN chown -R user:user /home/user/app # Switch to non-root user USER user # Expose port 7860 (Hugging Face Spaces standard) EXPOSE 7860 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ CMD curl -f http://localhost:7860/health || exit 1 # Run the server CMD ["python", "server.py"]