# Kubernetes-optimized Dockerfile for Frontend # Multi-stage build for production deployment # Stage 1: Build the application FROM node:18-alpine AS builder WORKDIR /app # Copy package files COPY package*.json ./ # Install all dependencies for building RUN npm ci --verbose && \ npm cache clean --force # Copy source code (excluding unnecessary files like node_modules, dist, etc.) COPY . . # Create a default runtime config in the public directory if it doesn't exist to satisfy the reference in index.html RUN if [ ! -f public/runtime-config.js ]; then \ mkdir -p public && \ echo "window.__RUNTIME_CONFIG__ = {};" > public/runtime-config.js; \ fi # Set build-time environment variables to prevent hanging on undefined variables ENV NODE_ENV=production ENV CI=true ENV VITE_API_URL=/api ENV VITE_APP_TITLE="BakeWise" ENV VITE_APP_VERSION="1.0.0" ENV VITE_PILOT_MODE_ENABLED="false" ENV VITE_PILOT_COUPON_CODE="PILOT2025" ENV VITE_PILOT_TRIAL_MONTHS="3" ENV VITE_STRIPE_PUBLISHABLE_KEY="pk_test_" # Set Node.js memory limit for the build process ENV NODE_OPTIONS="--max-old-space-size=4096" RUN npm run build # Stage 2: Production server with Nginx FROM nginx:1.25-alpine AS production # Install curl for health checks RUN apk add --no-cache curl # Copy main nginx configuration that sets the PID file location COPY nginx-main.conf /etc/nginx/nginx.conf # Remove default nginx configuration RUN rm /etc/nginx/conf.d/default.conf # Copy custom nginx configuration COPY nginx.conf /etc/nginx/conf.d/ # Copy built application from builder stage COPY --from=builder /app/dist /usr/share/nginx/html # Copy and setup environment substitution script COPY substitute-env.sh /docker-entrypoint.d/30-substitute-env.sh # Make the script executable RUN chmod +x /docker-entrypoint.d/30-substitute-env.sh # Set proper permissions RUN chown -R nginx:nginx /usr/share/nginx/html && \ chown -R nginx:nginx /var/cache/nginx && \ chown -R nginx:nginx /var/log/nginx && \ chown -R nginx:nginx /etc/nginx/conf.d # Create nginx PID directory and fix permissions RUN mkdir -p /var/run/nginx /var/lib/nginx/tmp && \ chown -R nginx:nginx /var/run/nginx /var/lib/nginx /etc/nginx # Switch to non-root user USER nginx # Expose port 3000 (to match current setup) EXPOSE 3000 # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \ CMD curl -f http://localhost:3000/health || exit 1 # Start nginx CMD ["nginx", "-g", "daemon off;"]