# Build stage FROM node:20-alpine AS builder RUN apk add --no-cache python3 make g++ RUN corepack enable && corepack prepare pnpm@10.28.2 --activate WORKDIR /app # Copy workspace config COPY package.json pnpm-workspace.yaml pnpm-lock.yaml turbo.json ./ COPY apps/api/package.json apps/api/ COPY packages/shared/package.json packages/shared/ # Enable hoisting so tsc can find all deps RUN echo "node-linker=hoisted" > .npmrc RUN pnpm install --frozen-lockfile # Copy source COPY apps/api/ apps/api/ COPY packages/shared/ packages/shared/ # Build api (node_modules are hoisted, tsc available at root) RUN cd apps/api && ../../node_modules/.bin/tsc \ && rm -f dist/db/migrations/*.d.ts dist/db/migrations/*.d.ts.map dist/db/migrations/*.js.map # Runtime stage FROM node:20-alpine RUN apk add --no-cache curl WORKDIR /app # Copy built output (includes compiled migrations + knexfile in dist/db/) COPY --from=builder /app/apps/api/dist ./dist COPY --from=builder /app/apps/api/package.json ./ # Copy node_modules (runtime deps including bcrypt native) COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/apps/api/node_modules ./apps_node_modules # Entrypoint COPY apps/api/docker-entrypoint.sh ./docker-entrypoint.sh RUN chmod +x ./docker-entrypoint.sh EXPOSE 3001 ENTRYPOINT ["./docker-entrypoint.sh"]