# Dockerfile # Stage 1: Build the application FROM docker.io/library/node:20-alpine AS builder WORKDIR /usr/src/app COPY package*.json ./ COPY tsconfig*.json ./ COPY prisma ./prisma/ RUN npm ci RUN npx prisma generate COPY . . RUN npm run build # Stage 2: Install production dependencies FROM docker.io/library/node:20-alpine AS prod-deps WORKDIR /app COPY package.json package-lock.json* ./ COPY prisma ./prisma # Install only production dependencies # generating prisma client again is often needed if it relies on post-install scripts or binary positioning RUN npm install --omit=dev RUN npx prisma generate # Stage 3: Run the application FROM gcr.io/distroless/nodejs20-debian12 WORKDIR /app ENV NODE_ENV=production # Copy necessary files from build stages COPY --from=prod-deps /app/node_modules ./node_modules COPY --from=builder /usr/src/app/dist ./dist # Copy prisma folder might be needed for migrations or schema references COPY --from=builder /usr/src/app/prisma ./prisma CMD ["dist/main.js"]