FROM node:20-alpine AS builder WORKDIR /app # Copy package files first for better caching COPY package.json package-lock.json ./ RUN npm ci --ignore-scripts # Copy source and build COPY . . RUN npm run build RUN npm prune --production # ── Production image ────────────────────────────────────────── FROM node:20-alpine AS production WORKDIR /app COPY --from=builder /app/package.json ./package.json COPY --from=builder /app/package-lock.json ./package-lock.json COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules EXPOSE 4000 # Run TypeORM migrations on startup, then start the API CMD ["sh", "-c", "npx typeorm migration:run -d dist/database/ormconfig.js 2>/dev/null; export NODE_OPTIONS='--max-old-space-size=1024' && npm run start:prod"]