monacousa-portal/Dockerfile

78 lines
2.0 KiB
Docker
Raw Permalink Normal View History

# Monaco USA Portal - SvelteKit Application
# Multi-stage build for optimized production image
# ============================================
# Stage 1: Dependencies
# ============================================
FROM node:20-alpine AS deps
WORKDIR /app
# Copy package files
COPY package.json package-lock.json* ./
# Install dependencies
RUN npm ci
# ============================================
# Stage 2: Builder
# ============================================
FROM node:20-alpine AS builder
WORKDIR /app
# Copy package files first
COPY package.json package-lock.json* ./
# Install dependencies - use npm install instead of npm ci to properly
# resolve platform-specific optional dependencies (rollup binaries)
RUN rm -rf node_modules && npm install --legacy-peer-deps
# Copy source files
COPY . .
# Build arguments for environment variables
ARG PUBLIC_SUPABASE_URL
ARG PUBLIC_SUPABASE_ANON_KEY
ARG SUPABASE_SERVICE_ROLE_KEY
# Set environment variables for build
ENV PUBLIC_SUPABASE_URL=$PUBLIC_SUPABASE_URL
ENV PUBLIC_SUPABASE_ANON_KEY=$PUBLIC_SUPABASE_ANON_KEY
ENV SUPABASE_SERVICE_ROLE_KEY=$SUPABASE_SERVICE_ROLE_KEY
# Build the application
RUN npm run build
# Prune dev dependencies
RUN npm prune --production
# ============================================
# Stage 3: Runner (Production)
# ============================================
FROM node:20-alpine AS runner
WORKDIR /app
# Set production environment
ENV NODE_ENV=production
# Create non-root user for security
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 sveltekit
# Copy built application
COPY --from=builder --chown=sveltekit:nodejs /app/build ./build
COPY --from=builder --chown=sveltekit:nodejs /app/node_modules ./node_modules
COPY --from=builder --chown=sveltekit:nodejs /app/package.json ./package.json
# Switch to non-root user
USER sveltekit
# Expose port
EXPOSE 3000
# Set runtime environment variables
ENV HOST=0.0.0.0
ENV PORT=3000
# Start the application
CMD ["node", "build"]