# syntax=docker.io/docker/dockerfile:1 # ---- 基础镜像:Alpine 轻量基础 + pnpm 全局安装 ---- FROM node:24-alpine AS base # 替换为阿里云镜像源,加速 apk 安装 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \ apk add --no-cache libc6-compat # pnpm 使用阿里云镜像源 RUN npm config set registry https://registry.npmmirror.com/ && \ npm install -g pnpm && \ pnpm config set registry https://registry.npmmirror.com/ WORKDIR /app # ---- 依赖安装层:独立分层,依赖不变时命中缓存 ---- FROM base AS deps COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ # 挂载 pnpm store 缓存,避免重复下载依赖包 RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \ pnpm install --frozen-lockfile --prefer-offline # ---- 构建层:生成 Prisma Client + Next.js 产物 ---- FROM base AS builder ENV NEXT_TELEMETRY_DISABLED=1 NODE_ENV=production # 构建时需要的环境变量(数据库连接、认证密钥等) ARG DATABASE_URL NEXT_PUBLIC_BASE_URL BETTER_AUTH_SECRET BETTER_AUTH_TELEMETRY REDIS_URL ENV DATABASE_URL=${DATABASE_URL} \ NEXT_PUBLIC_BASE_URL=${NEXT_PUBLIC_BASE_URL} \ BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET} \ BETTER_AUTH_TELEMETRY=${BETTER_AUTH_TELEMETRY} \ REDIS_URL=${REDIS_URL} # 从 deps 层复制已安装的 node_modules,避免重复安装 COPY --from=deps /app/node_modules ./node_modules COPY . . # 挂载 .next/cache 缓存,加速增量构建(webpack/turbopack 缓存复用) RUN --mount=type=cache,id=next-cache,target=/app/.next/cache \ pnpm db:generate && pnpm build # ---- 运行层:仅包含 standalone 产物,最小化镜像体积 ---- FROM node:24-alpine AS runner WORKDIR /app ENV NODE_ENV=production NEXT_TELEMETRY_DISABLED=1 PORT=3000 HOSTNAME="0.0.0.0" # 运行时环境变量 ARG DATABASE_URL NEXT_PUBLIC_BASE_URL BETTER_AUTH_SECRET BETTER_AUTH_TELEMETRY REDIS_URL ENV DATABASE_URL=${DATABASE_URL} \ NEXT_PUBLIC_BASE_URL=${NEXT_PUBLIC_BASE_URL} \ BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET} \ BETTER_AUTH_TELEMETRY=${BETTER_AUTH_TELEMETRY} \ REDIS_URL=${REDIS_URL} # 非 root 用户运行,提升安全性 RUN addgroup --system --gid 1001 nodejs && \ adduser --system --uid 1001 nextjs # 仅复制 standalone 产物 + 静态资源,不携带 node_modules 和源码 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 USER nextjs EXPOSE 3000 CMD ["node", "server.js"]