# Multi-stage build for production FROM node:20-alpine AS builder WORKDIR /app # Copy package files COPY package*.json ./ # Install ALL dependencies (including dev) for build RUN npm ci && npm cache clean --force # Copy source code COPY . . # Clear any existing build artifacts and build fresh RUN rm -rf build node_modules/.vite node_modules/.cache # Build the application RUN NODE_ENV=production npm run build # Production stage FROM node:20-alpine AS production WORKDIR /app # Install only production dependencies COPY package*.json ./ RUN npm ci --omit=dev && npm cache clean --force # Copy built application from builder stage COPY --from=builder /app/build ./build COPY --from=builder /app/public ./public # Create non-root user for security RUN addgroup -g 1001 -S nodejs && \ adduser -S remix -u 1001 # Change ownership of app directory RUN chown -R remix:nodejs /app USER remix # Set production environment ENV NODE_ENV=production # Expose port EXPOSE 3000 # Health check HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost:3000/ || exit 1 # Start production server CMD ["npm", "start"]