IAacademyTraining / Dockerfile
MAALOUFimad02's picture
Upload 4 files
6bc7f68 verified
Raw
History Blame Contribute Delete
3.16 kB
# =============================================================================
# Dockerfile — ML Training Platform pour HuggingFace Spaces (Docker SDK)
# =============================================================================
# Build: docker build -t ml-training-platform .
# Run: docker run -p 7860:7860 ml-training-platform
# =============================================================================
# --- Stage 1: Dependencies ---
FROM node:20-alpine AS deps
WORKDIR /app
# Install system dependencies for sharp (image processing) and Prisma
RUN apk add --no-cache libc6-compat openssl
# Copy package files
COPY package.json bun.lock ./
# Install bun and dependencies
RUN npm install -g bun && bun install --frozen-lockfile
# Copy Prisma schema
COPY prisma ./prisma/
# Generate Prisma client (pinned version to avoid CLI/client mismatch)
RUN bunx prisma@6 generate
# --- Stage 2: Build ---
FROM node:20-alpine AS builder
WORKDIR /app
# Install system dependencies
RUN apk add --no-cache libc6-compat openssl
# Copy package files
COPY package.json bun.lock ./
RUN npm install -g bun && bun install --frozen-lockfile
# Copy all source files
COPY . .
# Generate Prisma client (pinned version)
RUN bunx prisma@6 generate
# Set environment variables for build
ENV NEXT_TELEMETRY_DISABLED=1
ENV NODE_ENV=production
# Build Next.js
RUN bun run build
# --- Stage 3: Production ---
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV PORT=7860
ENV HOSTNAME="0.0.0.0"
# Install system dependencies for runtime
RUN apk add --no-cache libc6-compat openssl
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
# Copy standalone output from build stage
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
# Copy Prisma schema, generated client, and CLI from builder
COPY --from=builder /app/prisma ./prisma/
COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma/
COPY --from=builder /app/node_modules/@prisma ./node_modules/@prisma/
COPY --from=builder /app/node_modules/prisma ./node_modules/prisma/
# Install ONLY prisma CLI pinned to v6 (matches @prisma/client v6.x)
# NO tsx needed — seed script uses plain Node.js
RUN npm install -g prisma@6
# Create writable directories
RUN mkdir -p /app/data /app/uploads/notebooks && chown -R nextjs:nodejs /app/data /app/uploads
# Default database URL (can be overridden via HuggingFace Secrets)
ENV DATABASE_URL="file:/app/data/ml-academy.db"
# Default admin password (CHANGE THIS in HuggingFace Secrets!)
ENV ADMIN_PASSWORD="ml-admin-2024"
# Copy entrypoint script
COPY docker-entrypoint.sh /app/docker-entrypoint.sh
RUN chmod +x /app/docker-entrypoint.sh
# Switch to non-root user
USER nextjs
EXPOSE 7860
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:7860/ || exit 1
# Use entrypoint script
ENTRYPOINT ["/app/docker-entrypoint.sh"]