# ============================================ # YouduWiki Wiki 用户端 - 多阶段构建 # 构建上下文: ./web 目录 # ============================================ FROM node:22-alpine AS builder ENV PNPM_REGISTRY=https://registry.npmmirror.com WORKDIR /build # 安装 pnpm RUN corepack enable && corepack prepare pnpm@10 --activate # 复制 workspace 配置和锁文件 COPY pnpm-workspace.yaml pnpm-lock.yaml package.json ./ # 复制所有 workspace 包的 package.json COPY packages/icons/package.json packages/icons/ COPY packages/themes/package.json packages/themes/ COPY packages/ui/package.json packages/ui/ COPY admin/package.json admin/ COPY app/package.json app/ # 安装依赖 RUN pnpm install --frozen-lockfile # 复制源码 (app 构建需要 workspace 包) COPY tsconfig.base.json ./ COPY packages/icons/ packages/icons/ COPY packages/themes/ packages/themes/ COPY packages/ui/ packages/ui/ COPY app/ app/ # 构建 Next.js 应用 ENV NODE_OPTIONS=--max-old-space-size=2048 RUN pnpm --filter panda-wiki-app build # ============================================ # 运行时镜像 # ============================================ FROM node:22-alpine AS runner ENV NODE_ENV=production RUN addgroup -g 1001 -S nodejs && \ adduser -S nextjs -u 1001 WORKDIR /app # 复制 public 目录 COPY --from=builder --chown=nextjs:nodejs /build/app/public ./app/public # 复制 standalone 构建输出 COPY --from=builder --chown=nextjs:nodejs /build/app/dist/standalone ./ # 复制静态资源 COPY --from=builder --chown=nextjs:nodejs /build/app/dist/static ./app/dist/static # 如果存在 public 下的静态资源也复制 RUN mkdir -p app/public && \ cp -r /build/app/public/. app/public/ 2>/dev/null || true USER nextjs EXPOSE 3010 ENV PORT=3010 ENV HOSTNAME="0.0.0.0" CMD ["node", "app/server.js"]