Some checks failed
Build and Deploy / build-and-deploy (push) Has been cancelled
Root cause: pnpm 10+ skips lifecycle scripts in root/CI environments by default, so the project's postinstall (prisma generate) never ran. The runner stage then failed to COPY node_modules/.prisma because builder never produced it. Fix: install with --ignore-scripts, then call `pnpm exec prisma generate` explicitly in both deps and builder stages, with ls assertions to surface any future regression early. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
62 lines
2.3 KiB
Docker
62 lines
2.3 KiB
Docker
# syntax=docker/dockerfile:1
|
||
# ───────────── 1. deps:安装依赖 + 显式生成 Prisma Client ─────────────
|
||
FROM node:22-alpine AS deps
|
||
RUN apk add --no-cache libc6-compat openssl
|
||
WORKDIR /app
|
||
|
||
RUN corepack enable && corepack prepare pnpm@latest --activate \
|
||
&& pnpm config set registry https://registry.npmmirror.com
|
||
|
||
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
||
COPY prisma ./prisma
|
||
|
||
# pnpm 10+ 在 root/CI 环境默认不跑 lifecycle scripts,因此显式调用 prisma generate
|
||
RUN pnpm install --frozen-lockfile --ignore-scripts \
|
||
&& pnpm exec prisma generate \
|
||
&& ls -la /app/node_modules/.prisma/client/ \
|
||
&& ls -la /app/node_modules/@prisma/client/
|
||
|
||
# ───────────── 2. builder:Next.js 构建(standalone 产物) ─────────────
|
||
FROM node:22-alpine AS builder
|
||
RUN apk add --no-cache libc6-compat openssl
|
||
WORKDIR /app
|
||
|
||
RUN corepack enable && corepack prepare pnpm@latest --activate
|
||
|
||
COPY --from=deps /app/node_modules ./node_modules
|
||
COPY . .
|
||
|
||
ENV NEXT_TELEMETRY_DISABLED=1
|
||
# 再次保险生成(COPY . . 会覆盖 prisma/ schema 的最新版本),然后构建
|
||
RUN pnpm exec prisma generate \
|
||
&& pnpm exec next build \
|
||
&& ls -la /app/node_modules/.prisma/client/
|
||
|
||
# ───────────── 3. runner:最小运行时镜像 ─────────────
|
||
FROM node:22-alpine AS runner
|
||
RUN apk add --no-cache libc6-compat openssl
|
||
WORKDIR /app
|
||
|
||
ENV NODE_ENV=production
|
||
ENV NEXT_TELEMETRY_DISABLED=1
|
||
ENV PORT=3000
|
||
ENV HOSTNAME=0.0.0.0
|
||
|
||
RUN addgroup --system --gid 1001 nodejs \
|
||
&& adduser --system --uid 1001 nextjs
|
||
|
||
# Next.js standalone 输出 + 静态资源 + public
|
||
COPY --from=builder /app/public ./public
|
||
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||
|
||
# Prisma:生成的 client + schema(运行时 db:push / 迁移可能用到)
|
||
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/.prisma ./node_modules/.prisma
|
||
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/@prisma ./node_modules/@prisma
|
||
COPY --from=builder --chown=nextjs:nodejs /app/prisma ./prisma
|
||
|
||
USER nextjs
|
||
EXPOSE 3000
|
||
|
||
CMD ["node", "server.js"]
|