# docker/Dockerfile # ============ Build stage ============ FROM node:20-alpine AS builder WORKDIR /app # Install pnpm RUN corepack enable && corepack prepare pnpm@latest --activate # Copy package files COPY package.json pnpm-lock.yaml ./ RUN pnpm install --frozen-lockfile # Copy source and build COPY . . RUN pnpm prisma generate RUN pnpm build # ============ Production stage ============ FROM node:20-alpine AS runner WORKDIR /app # Install pnpm RUN corepack enable && corepack prepare pnpm@latest --activate # Create non-root user RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 app # Copy built application COPY --from=builder --chown=app:nodejs /app/.output ./.output COPY --from=builder --chown=app:nodejs /app/node_modules ./node_modules COPY --from=builder --chown=app:nodejs /app/package.json ./package.json COPY --from=builder --chown=app:nodejs /app/prisma ./prisma USER app EXPOSE 3000 ENV NODE_ENV=production ENV PORT=3000 CMD ["node", ".output/server/index.mjs"]