-
Notifications
You must be signed in to change notification settings - Fork 197
Expand file tree
/
Copy pathDockerfile
More file actions
107 lines (83 loc) Β· 4.49 KB
/
Dockerfile
File metadata and controls
107 lines (83 loc) Β· 4.49 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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# Multi-arch: supports linux/amd64 (Ubuntu/x86) and linux/arm64 (Apple Silicon)
# Build with: docker buildx build --platform linux/amd64,linux/arm64 -t ...
FROM node:24-alpine AS base
RUN npm config set registry https://registry.npmmirror.com && \
apk add --no-cache libc6-compat && \
corepack enable && \
corepack prepare pnpm@10.28.2 --activate && \
pnpm config set registry https://registry.npmmirror.com
WORKDIR /app
# βββ Stage 1: Install all dependencies βββββββββββββββββββββββββββββββ
FROM base AS deps
COPY .npmrc package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY apps/DocFlow/package.json ./apps/DocFlow/package.json
COPY packages/bilibili/package.json ./packages/bilibili/package.json
RUN pnpm install --frozen-lockfile --ignore-scripts
# βββ Stage 2: Build workspace packages & Next.js app βββββββββββββββββ
FROM base AS builder
ARG VERSION=unknown
ARG GIT_COMMIT=unknown
WORKDIR /app
# Copy installed dependencies (preserves pnpm workspace symlink structure)
COPY --from=deps /app ./
# Copy build configuration (tsconfig.base.json required by packages/* tsconfig extends)
COPY turbo.json tsconfig.base.json tsconfig.json tsconfig.build.json ./
# Copy source code (overlays on top; existing node_modules from deps are preserved)
COPY apps/ ./apps/
COPY packages/bilibili/ ./packages/bilibili/
# ζε»ΊζΆη―ε’ει
ENV NEXT_TELEMETRY_DISABLED=1
ENV NODE_OPTIONS="--max-old-space-size=4096"
# Build DocFlow + workspace deps @syncflow/bilibili (transformer excluded, backend-only)
RUN pnpm turbo run build --filter=DocFlow && \
rm -rf apps/DocFlow/.next/cache
# βββ Stage 3: Production dependencies only βββββββββββββββββββββββββββ
FROM base AS prod-deps
WORKDIR /app
COPY .npmrc package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY apps/DocFlow/package.json ./apps/DocFlow/package.json
COPY packages/bilibili/package.json ./packages/bilibili/package.json
RUN pnpm install --frozen-lockfile --prod --ignore-scripts && \
( find node_modules -name "*.d.ts" -delete 2>/dev/null; \
find node_modules -name "*.map" -delete 2>/dev/null; \
find node_modules -name "README*" -delete 2>/dev/null; \
find node_modules -name "CHANGELOG*" -delete 2>/dev/null; \
find node_modules -name "*.md" ! -name "package.json" -delete 2>/dev/null; \
find node_modules -name "LICENSE*" -delete 2>/dev/null; \
find node_modules -type d -name "test" -exec rm -rf {} + 2>/dev/null; \
find node_modules -type d -name "tests" -exec rm -rf {} + 2>/dev/null; \
find node_modules -type d -name "__tests__" -exec rm -rf {} + 2>/dev/null; \
find node_modules -type d -name "docs" -exec rm -rf {} + 2>/dev/null; \
find node_modules -type d -name "examples" -exec rm -rf {} + 2>/dev/null; \
true )
# βββ Stage 4: Final runtime image ββββββββββββββββββββββββββββββββββββ
FROM node:24-alpine AS runner
ARG VERSION=unknown
ARG GIT_COMMIT=unknown
WORKDIR /app
ENV NODE_ENV=production \
NEXT_TELEMETRY_DISABLED=1 \
PORT=3000 \
HOSTNAME=0.0.0.0
# ιεζ ηΎ
LABEL org.opencontainers.image.title="DocFlow" \
org.opencontainers.image.description="Modern collaborative document editing platform" \
org.opencontainers.image.version="${VERSION}" \
org.opencontainers.image.revision="${GIT_COMMIT}"
RUN apk add --no-cache libc6-compat && \
addgroup --system --gid 1001 nodejs && \
adduser --system --uid 1001 nextjs
# Copy production dependencies (includes pnpm workspace symlink structure)
COPY --from=prod-deps --chown=nextjs:nodejs /app ./
# Copy built workspace packages (dist for workspace:* runtime resolution)
COPY --from=builder --chown=nextjs:nodejs /app/packages/bilibili/dist ./packages/bilibili/dist
COPY --from=builder --chown=nextjs:nodejs /app/packages/bilibili/src/bilibili.css ./packages/bilibili/src/bilibili.css
# Copy built Next.js app
COPY --from=builder --chown=nextjs:nodejs /app/apps/DocFlow/.next ./apps/DocFlow/.next
COPY --from=builder --chown=nextjs:nodejs /app/apps/DocFlow/public ./apps/DocFlow/public
USER nextjs
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
CMD node -e "require('http').get('http://localhost:3000/api/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"
WORKDIR /app/apps/DocFlow
CMD ["node_modules/.bin/next", "start"]