pokedex-web / Dockerfile
gpimentel's picture
feat: integrate BiRefNet model with LFS tracking for v1.2.0
81faab5
Raw
History Blame Contribute Delete
2.16 kB
# ---------------------------------------------------------
# Stage 1: Build the frontend Next.js App
# ---------------------------------------------------------
FROM node:20-alpine AS frontend-builder
WORKDIR /app
# Install dependencies first for layer caching
COPY frontend/package*.json ./
RUN npm ci
# Copy the rest of the frontend source
COPY frontend/ ./
# Generate the static HTML/CSS/JS export in /app/out
RUN npm run build
# ---------------------------------------------------------
# Stage 2: Build the FastAPI Backend
# ---------------------------------------------------------
FROM python:3.12-slim
# Install system packages including C++ compiler for PyTorch Inductor (torch.compile)
RUN apt-get update && apt-get install -y --no-install-recommends \
g++ \
&& rm -rf /var/lib/apt/lists/*
# Create a non-root user (UID 1000) as required by Hugging Face Spaces
RUN useradd -m -u 1000 user
WORKDIR /app
# Copy backend requirements first for caching
COPY --chown=user:user backend/requirements.txt /app/
# Install Python dependencies
# CRITICAL: We force the installation of CPU-only PyTorch wheels.
# This drastically reduces the image size (from ~2.5GB to ~500MB)
# and fits nicely into Hugging Face Spaces free-tier constraints.
RUN pip install --no-cache-dir -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cpu
# Copy the rest of the backend files
COPY --chown=user:user backend/ /app/
# Copy the built frontend static files from Stage 1
# FastAPI mounts this at '/'
COPY --from=frontend-builder --chown=user:user /app/out /app/static
# Ensure the database and current directory are writable by 'user'
# (The PokemonService cache writes to poke_database.json)
RUN chown -R user:user /app
# Switch to the non-root user
USER user
# Set environment variables
ENV HOME=/home/user \
PATH=/home/user/.local/bin:$PATH \
PYTHONUNBUFFERED=1 \
OMP_NUM_THREADS=1 \
MKL_NUM_THREADS=1 \
HF_HOME=/tmp/hf_home
# Expose the default port used by Hugging Face Spaces
EXPOSE 7860
# Start Uvicorn bound to 0.0.0.0 and port 7860
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]