Bentopdf / Dockerfile
AUXteam's picture
Upload Dockerfile with huggingface_hub
fb32bb8 verified
# Global variable declaration:
# Build to serve under Subdirectory BASE_URL if provided, eg: "ARG BASE_URL=/pdf/", otherwise leave blank: "ARG BASE_URL="
ARG BASE_URL=
# Build stage for frontend
FROM public.ecr.aws/docker/library/node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
COPY vendor ./vendor
ENV HUSKY=0
RUN npm ci
COPY . .
# Build configuration arguments
ARG SIMPLE_MODE=false
ENV SIMPLE_MODE=$SIMPLE_MODE
ARG COMPRESSION_MODE=all
ENV COMPRESSION_MODE=$COMPRESSION_MODE
# global arg to local arg - BASE_URL is read from env by vite.config.ts
ARG BASE_URL
ENV BASE_URL=$BASE_URL
# WASM module URLs (pre-configured defaults)
ARG VITE_WASM_PYMUPDF_URL
ARG VITE_WASM_GS_URL
ARG VITE_WASM_CPDF_URL
ENV VITE_WASM_PYMUPDF_URL=$VITE_WASM_PYMUPDF_URL
ENV VITE_WASM_GS_URL=$VITE_WASM_GS_URL
ENV VITE_WASM_CPDF_URL=$VITE_WASM_CPDF_URL
# Default UI language (e.g. en, fr, de, es, zh, ar)
ARG VITE_DEFAULT_LANGUAGE
ENV VITE_DEFAULT_LANGUAGE=$VITE_DEFAULT_LANGUAGE
# Custom branding (e.g. VITE_BRAND_NAME=MyCompany VITE_BRAND_LOGO=my-logo.svg)
ARG VITE_BRAND_NAME
ARG VITE_BRAND_LOGO
ARG VITE_FOOTER_TEXT
ENV VITE_BRAND_NAME=$VITE_BRAND_NAME
ENV VITE_BRAND_LOGO=$VITE_BRAND_LOGO
ENV VITE_FOOTER_TEXT=$VITE_FOOTER_TEXT
# Increase memory limit for Vite/Node.js build to avoid OOM
ENV NODE_OPTIONS="--max-old-space-size=4096"
RUN npm run build:with-docs
# Final stage with Python and FastAPI
FROM python:3.11-slim
LABEL org.opencontainers.image.source="https://github.com/alam00000/bentopdf"
LABEL org.opencontainers.image.url="https://github.com/alam00000/bentopdf"
WORKDIR /app
# Install uv for fast package management (as root)
RUN pip install --no-cache-dir uv
# Copy only the necessary files for the backend
COPY requirements.txt .
COPY app.py .
# Install Python dependencies using uv (as root)
RUN uv pip install --system --no-cache-dir -r requirements.txt
# Create a non-root user for security (UID 1000 is preferred by Hugging Face)
RUN useradd -m -u 1000 user
ENV PATH="/home/user/.local/bin:$PATH"
# Copy the built frontend from the builder stage
COPY --chown=user:user --from=builder /app/dist ./dist
RUN chown -R user:user /app
USER user
# Expose the Hugging Face Space port
EXPOSE 7860
# Start the application using uvicorn
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]