BIAF-offASR / Dockerfile
froster02's picture
feat: optimize for HF Spaces deployment
6919c1d
# Stage 1: Build the React frontend
FROM node:20-alpine AS frontend-builder
WORKDIR /app/frontend
COPY frontend/package*.json ./
RUN npm ci
COPY frontend/ ./
RUN npm run build
# Stage 2: Build the FastAPI backend and final image
FROM python:3.11-slim-bookworm
# Install system dependencies (ffmpeg and libsndfile1 for sound processing)
RUN apt-get update && apt-get install -y --no-install-recommends \
ffmpeg \
libsndfile1 \
curl \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Copy backend requirements first to leverage caching
COPY backend/requirements.txt ./backend/
# Optimize PyTorch: Install CPU-only PyTorch to reduce image size drastically from 5GB+ to under 2GB (excluding models)
RUN pip install --no-cache-dir "torch>=2.6.0" "torchvision>=0.19.0" --index-url https://download.pytorch.org/whl/cpu
RUN pip install --no-cache-dir -r backend/requirements.txt
# Copy all source files
COPY backend/ ./backend/
# Create a non-root user with UID 1000 (standard for Hugging Face Spaces)
RUN useradd -m -u 1000 user
# Set environment variables for model caching in a writable location
ENV HF_HOME=/app/backend/models/hf_cache
ENV EASYOCR_MODULE_PATH=/app/backend/models/easyocr
# Pre-download and bake models inside the Docker image
# We run this as root but ensure the directory exists and will be chowned
RUN mkdir -p /app/backend/models/easyocr && \
python backend/download_models.py backend/models
# Copy the built React assets from Stage 1 into the backend's static folder
COPY --from=frontend-builder /app/frontend/dist ./frontend/dist
# Set directory ownerships for the non-root user
RUN chown -R 1000:1000 /app
# Switch to the non-root user
USER user
ENV HOME=/home/user
ENV PATH="/home/user/.local/bin:$PATH"
# Expose port 7860
EXPOSE 7860
# Set environment variable for port (Hugging Face Spaces passes PORT=7860, defaults to 7860)
ENV PORT=7860
# Start Uvicorn serving both backend endpoints and compiled static UI
CMD ["sh", "-c", "uvicorn backend.app:app --host 0.0.0.0 --port ${PORT}"]