All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 6m54s
- env: 解封 .env / .env.production 提交, 仅忽略 .env.local 系列; .env.production 承载 DATABASE_URL / AUTH_SECRET / AUTH_URL / SMS_* / NEXT_PUBLIC_TOS_DOMAIN, Dockerfile runner 阶段 COPY 进 运行时镜像, Next.js standalone 启动自动加载 - ci: 移除 kubectl 注入 secret 步骤(env 已烧入镜像), 保留占位避免 envFrom optional 引用告警, 修复 /api/auth/providers 500 (缺 AUTH_SECRET) - auth: signIn 失败透传 NextAuth 真实错误码, 不再被"验证码错误"一刀切掩盖 - home: 首页 scroll-snap-type 由 mandatory 改 proximity, 修复滚动到 底部被强制吸回候选区顶部的回弹 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
72 lines
3.0 KiB
Docker
72 lines
3.0 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
|
||
|
||
# .npmrc 必须先 COPY,否则 pnpm install 看不到 node-linker=hoisted
|
||
COPY .npmrc package.json pnpm-lock.yaml pnpm-workspace.yaml ./
|
||
COPY prisma ./prisma
|
||
|
||
# pnpm 10+ 在 root/CI 默认跳过 lifecycle scripts,因此显式调用 prisma generate
|
||
# Prisma 6 直接把 client 写入 @prisma/client 包目录(不再用 .prisma/client)
|
||
RUN pnpm install --frozen-lockfile --ignore-scripts \
|
||
&& pnpm exec prisma generate \
|
||
&& ls -la /app/node_modules/@prisma/client/ \
|
||
&& ls /app/node_modules/@prisma/client/ | grep -E "(libquery_engine|schema.prisma|index.js)" || true
|
||
|
||
# ───────────── 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 . .
|
||
|
||
# Build-time public env:NEXT_PUBLIC_* 必须在 next build 之前注入,
|
||
# 否则会被烧成空字符串,运行时再设也无效 (Next.js 把这类 env 编译进 client bundle)
|
||
ARG NEXT_PUBLIC_TOS_DOMAIN
|
||
ENV NEXT_PUBLIC_TOS_DOMAIN=${NEXT_PUBLIC_TOS_DOMAIN}
|
||
ENV NEXT_TELEMETRY_DISABLED=1
|
||
# COPY . . 会覆盖 prisma/schema 的最新版本,需要再 generate 一次确保 client 同步
|
||
RUN pnpm exec prisma generate \
|
||
&& pnpm exec next build \
|
||
&& ls -la /app/node_modules/@prisma/client/ \
|
||
&& ls -la /app/.next/standalone/
|
||
|
||
# ───────────── 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 自带通过 tracing 解析出的运行时依赖(含 @prisma/client)
|
||
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:tracing 有时会漏掉 engine 二进制和 schema
|
||
COPY --from=builder --chown=nextjs:nodejs /app/node_modules/@prisma ./node_modules/@prisma
|
||
COPY --from=builder --chown=nextjs:nodejs /app/prisma ./prisma
|
||
|
||
# 运行时 env: Next.js standalone server.js 启动时从 cwd 加载 .env.production
|
||
# (next build 已经把 NEXT_PUBLIC_* 烧进 bundle, 这里管的是服务端 env 如 DATABASE_URL / AUTH_SECRET)
|
||
COPY --from=builder --chown=nextjs:nodejs /app/.env.production ./.env.production
|
||
|
||
USER nextjs
|
||
EXPOSE 3000
|
||
|
||
CMD ["node", "server.js"]
|