forked from wafflebase/wafflebase
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
93 lines (71 loc) · 3.35 KB
/
Copy pathDockerfile
File metadata and controls
93 lines (71 loc) · 3.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# ---------------------------------------------------------------------------
# Stage 1: Build (runs on the CI host architecture — no QEMU emulation)
# ---------------------------------------------------------------------------
FROM --platform=$BUILDPLATFORM node:20-alpine AS builder
RUN corepack enable && corepack prepare pnpm@10.5.2 --activate
WORKDIR /app
# Copy package manifests and workspace config
COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml* ./
COPY packages/backend/package.json ./packages/backend/
COPY packages/core/package.json ./packages/core/
COPY packages/sheets/package.json ./packages/sheets/
COPY packages/docs/package.json ./packages/docs/
COPY packages/slides/package.json ./packages/slides/
# Copy Prisma schema (needed by postinstall: prisma generate)
COPY packages/backend/prisma ./packages/backend/prisma
# Install all dependencies (runs natively — fast)
RUN pnpm install --frozen-lockfile --filter @wafflebase/backend...
# Copy source
COPY packages/core/ ./packages/core/
COPY packages/sheets/ ./packages/sheets/
COPY packages/docs/ ./packages/docs/
COPY packages/slides/ ./packages/slides/
COPY packages/backend/ ./packages/backend/
# Build core → shared design tokens + geometry (JS + CSS) consumed by
# sheets/docs/slides. Its dist/ is gitignored, so it must be built before any
# consumer can resolve it.
WORKDIR /app/packages/core
RUN pnpm run build
# Build sheet → platform-independent JS bundle
WORKDIR /app/packages/sheets
RUN pnpm run build
# Build docs → platform-independent JS bundle
WORKDIR /app/packages/docs
RUN pnpm run build
# Build slides → backend type-checks against the emitted .d.ts because
# `tsconfig.build.json` clears `paths`, so resolution falls back to the
# workspace symlink + slides' `types` entry under `dist/`.
WORKDIR /app/packages/slides
RUN pnpm run build
# Build backend → platform-independent JS via SWC
WORKDIR /app/packages/backend
RUN pnpm run build
# ---------------------------------------------------------------------------
# Stage 2: Runtime (target platform)
# ---------------------------------------------------------------------------
FROM node:20-alpine
RUN corepack enable && corepack prepare pnpm@10.5.2 --activate
WORKDIR /app
# Copy workspace manifests
COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml* ./
COPY packages/backend/package.json ./packages/backend/
COPY packages/sheets/package.json ./packages/sheets/
COPY packages/docs/package.json ./packages/docs/
COPY packages/slides/package.json ./packages/slides/
# Copy Prisma schema (needed for prisma generate)
COPY packages/backend/prisma ./packages/backend/prisma
# Install production dependencies only, skip postinstall scripts to avoid
# needing the prisma CLI (which is a devDependency).
RUN pnpm install --frozen-lockfile --prod --ignore-scripts --filter @wafflebase/backend...
# Install Prisma CLI (pinned version) and generate client for target platform.
# The CLI stays in the image so init containers can run `npx prisma migrate deploy`.
WORKDIR /app/packages/backend
RUN npx prisma@6.6.0 generate
# Copy built artifacts from builder stage
COPY --from=builder /app/packages/sheets/dist /app/packages/sheets/dist
COPY --from=builder /app/packages/docs/dist /app/packages/docs/dist
COPY --from=builder /app/packages/backend/dist /app/packages/backend/dist
ENV NODE_ENV=production
ENV PORT=3000
EXPOSE 3000
CMD ["node", "dist/main"]