# ========================================== # Stage 1: Builder # Build the React application with Vite # ========================================== FROM node:20-alpine AS builder WORKDIR /app # Copy package files COPY package*.json ./ # Install dependencies RUN npm ci # Copy application source (includes .env.production with correct values) COPY . . # Build the application # Vite automatically uses .env.production for production builds RUN npx vite build # ========================================== # Stage 2: Production Runtime # Serve static files with Nginx # ========================================== FROM nginx:1.27-alpine AS production # Copy custom nginx configuration COPY nginx.conf /etc/nginx/conf.d/default.conf # Copy built application from builder stage COPY --from=builder /app/dist /usr/share/nginx/html # Create non-root user for nginx RUN chown -R nginx:nginx /usr/share/nginx/html && \ chown -R nginx:nginx /var/cache/nginx && \ chown -R nginx:nginx /var/log/nginx && \ touch /var/run/nginx.pid && \ chown -R nginx:nginx /var/run/nginx.pid # Switch to non-root user USER nginx # Expose HTTP port EXPOSE 80 # Health check HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD wget --no-verbose --tries=1 --spider http://localhost/ || exit 1 # Start nginx CMD ["nginx", "-g", "daemon off;"]