1+ # syntax=docker/dockerfile:1
2+
3+ FROM node:20-alpine AS builder
4+
5+ WORKDIR /app
6+
7+ COPY packages/shared/package*.json ./packages/shared/
8+ COPY apps/backend/package*.json ./apps/backend/
9+ COPY apps/backend/prisma ./apps/backend/prisma
10+ COPY packages/shared ./packages/shared
11+
12+ # Build shared package first
13+ WORKDIR /app/packages/shared
14+ RUN --mount=type=cache,target=/root/.npm \
15+ npm ci --cache /root/.npm
16+ RUN npm run build
17+
18+ # Install and build backend
19+ WORKDIR /app/apps/backend
20+ RUN --mount=type=cache,target=/root/.npm \
21+ npm ci --cache /root/.npm
22+
23+ COPY apps/backend ./
24+
25+ RUN npm run build
26+
27+ FROM node:20-alpine AS runner
28+
29+ WORKDIR /app
30+
31+ ENV NODE_ENV=production
32+
33+ RUN addgroup -S appgroup && adduser -S appuser -G appgroup
34+
35+ # Copy shared package (compiled dist + package.json only)
36+ COPY --from=builder /app/packages/shared/package.json ./packages/shared/
37+ COPY --from=builder /app/packages/shared/dist ./packages/shared/dist
38+
39+ COPY --from=builder /app/apps/backend/package*.json ./apps/backend/
40+ COPY --from=builder /app/apps/backend/node_modules ./apps/backend/node_modules
41+ COPY --from=builder /app/apps/backend/dist ./apps/backend/dist
42+ COPY --from=builder /app/apps/backend/prisma ./apps/backend/prisma
43+
44+ RUN chown -R appuser:appgroup /app
45+
46+ USER appuser
47+
48+ EXPOSE 3000
49+
50+ WORKDIR /app/apps/backend
51+
52+ CMD ["node" , "dist/server.js" ]
0 commit comments