UI-UX/Dockerfile
zyc 7168e50a6e
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 6m54s
fix: prod login + env-file driven config + scroll-snap bounce
- 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>
2026-05-14 17:31:00 +08:00

72 lines
3.0 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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. builderNext.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 envNEXT_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
# 显式补 Prismatracing 有时会漏掉 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"]