# syntax=docker/dockerfile:1.7 # Multi-stage build for optimization # Stage 1: Dependencies FROM node:22-alpine AS deps WORKDIR /app # Copy only package files for better layer caching COPY package.json package-lock.json ./ # Install dependencies with cache mount for npm packages RUN --mount=type=cache,target=/root/.npm \ npm ci --no-audit --no-fund # Stage 2: Build FROM node:22-alpine AS builder WORKDIR /app # Build arguments - all required, no defaults ARG NEXT_PUBLIC_PYTHON_API_URL ARG NEXT_PUBLIC_SWISSOID_TARGET_SERVICE_HANDLE ARG NEXT_PUBLIC_AUTH_BACKEND_URL ARG NEXT_PUBLIC_APP_VERSION ARG NEXT_PUBLIC_WEBSOCKET_URL # Set environment variables for build ENV NEXT_PUBLIC_PYTHON_API_URL=${NEXT_PUBLIC_PYTHON_API_URL} ENV NEXT_PUBLIC_SWISSOID_TARGET_SERVICE_HANDLE=${NEXT_PUBLIC_SWISSOID_TARGET_SERVICE_HANDLE} ENV NEXT_PUBLIC_AUTH_BACKEND_URL=${NEXT_PUBLIC_AUTH_BACKEND_URL} ENV NEXT_PUBLIC_APP_VERSION=${NEXT_PUBLIC_APP_VERSION} ENV NEXT_PUBLIC_WEBSOCKET_URL=${NEXT_PUBLIC_WEBSOCKET_URL} ENV NEXT_TELEMETRY_DISABLED=1 # Copy dependencies from deps stage COPY --from=deps /app/node_modules ./node_modules # Copy source code COPY . . # Build the application with cache mount for Next.js compilation artifacts RUN --mount=type=cache,target=/app/.next/cache \ npm run build # Stage 3: Runtime FROM node:22-alpine AS runner WORKDIR /app ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 # Copy package files COPY package.json package-lock.json ./ # Copy built application COPY --from=builder /app/.next ./.next COPY --from=builder /app/public ./public COPY --from=builder /app/node_modules ./node_modules # Expose the port EXPOSE 8200 # Start the production server CMD ["npm", "start"]