trigo / Dockerfile
k-l-lambda's picture
Use pre-built dist folder instead of building in Docker
11f07f6
raw
history blame
1.92 kB
FROM node:20-slim
# Set noninteractive installation
ENV DEBIAN_FRONTEND=noninteractive
# Build timestamp to force cache invalidation: 2026-01-12T22:15
# Install build dependencies
RUN apt-get update && apt-get install -y \
curl \
git \
&& rm -rf /var/lib/apt/lists/*
# Create app directory
WORKDIR /app
# Copy package files first for better caching
COPY trigo-web/package*.json ./
COPY trigo-web/app/package*.json ./app/
COPY trigo-web/backend/package*.json ./backend/
# Copy .env files
COPY trigo-web/.env* ./
COPY trigo-web/app/.env* ./app/
COPY trigo-web/backend/.env* ./backend/
# Install build tools globally
RUN npm install -g tsx jison typescript esbuild
# Install production dependencies only at root level
RUN npm install --omit=dev
# Install app runtime dependencies (for onnxruntime-web)
RUN cd app && npm install --omit=dev
# Install backend dependencies
RUN cd backend && npm install
# Copy pre-built frontend dist folder (includes ONNX models and WASM files via LFS)
COPY trigo-web/app/dist/ ./app/dist/
# Copy public folder
COPY trigo-web/public/ ./public/
# Copy inc folder (shared types)
COPY trigo-web/inc/ ./inc/
# Copy backend source and build with esbuild
COPY trigo-web/backend/src/ ./backend/src/
COPY trigo-web/backend/tsconfig.json ./backend/
RUN mkdir -p backend/dist/backend/src && \
esbuild backend/src/server.ts --bundle --platform=node --target=node20 --format=esm --outfile=backend/dist/backend/src/server.js --external:express --external:socket.io --external:cors --external:dotenv --external:uuid
# Copy the pre-built parser
COPY trigo-web/public/lib/tgnParser.cjs ./public/lib/
# Set environment variables for Hugging Face Spaces
ENV PORT=7860
ENV HOST=0.0.0.0
ENV NODE_ENV=production
# Expose port 7860 (required by Hugging Face Spaces)
EXPOSE 7860
# Start backend server (which will also serve frontend static files)
CMD ["npm", "run", "start:prod"]