diff --git a/Dockerfile b/Dockerfile index 1282fd86df..bc1802dc64 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,66 +1,60 @@ -ARG NODE_IMAGE_VERSION="22-alpine" +# syntax=docker/dockerfile:1.7 -# Install dependencies only when needed -FROM node:${NODE_IMAGE_VERSION} AS deps -# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. -RUN apk add --no-cache libc6-compat -WORKDIR /app -COPY package.json pnpm-lock.yaml ./ -RUN npm install -g pnpm -RUN pnpm install --frozen-lockfile +ARG NODE_VERSION=24-alpine +ARG PNPM_VERSION=10.32.1 -# Rebuild the source code only when needed -FROM node:${NODE_IMAGE_VERSION} AS builder +FROM node:${NODE_VERSION} AS base WORKDIR /app -COPY --from=deps /app/node_modules ./node_modules -COPY . . -COPY docker/middleware.ts ./src +ENV NEXT_TELEMETRY_DISABLED=1 -ARG BASE_PATH +FROM base AS deps +RUN corepack enable && corepack prepare pnpm@${PNPM_VERSION} --activate -ENV BASE_PATH=$BASE_PATH -ENV NEXT_TELEMETRY_DISABLED=1 -ENV DATABASE_URL="postgresql://user:pass@localhost:5432/dummy" +COPY package.json ./ +# 如果你们有这些文件,也要一起 copy,避免依赖层失真 +# COPY .npmrc pnpm-workspace.yaml ./ +# COPY patches ./patches -RUN npm run build-docker +RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ + pnpm config set store-dir /pnpm/store && \ + pnpm install -# Production image, copy all the files and run next -FROM node:${NODE_IMAGE_VERSION} AS runner -WORKDIR /app +FROM base AS builder +RUN corepack enable && corepack prepare pnpm@${PNPM_VERSION} --activate -ARG PRISMA_VERSION="6.19.0" -ARG NODE_OPTIONS +COPY --from=deps /app/node_modules ./node_modules +COPY . . +COPY docker/middleware.ts ./src/middleware.ts +ARG BASE_PATH ENV NODE_ENV=production -ENV NEXT_TELEMETRY_DISABLED=1 -ENV NODE_OPTIONS=$NODE_OPTIONS -RUN addgroup --system --gid 1001 nodejs -RUN adduser --system --uid 1001 nextjs -RUN set -x \ - && apk add --no-cache curl \ - && npm install -g pnpm +RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ + BASE_PATH="${BASE_PATH}" \ + DATABASE_URL="postgresql://user:pass@localhost:5432/dummy" \ + pnpm run build-docker -# Script dependencies -RUN pnpm --allow-build='@prisma/engines' add npm-run-all dotenv chalk semver \ - prisma@${PRISMA_VERSION} \ - @prisma/adapter-pg@${PRISMA_VERSION} +FROM base AS runner +ENV NODE_ENV=production +ENV HOSTNAME=0.0.0.0 +ENV PORT=3000 -COPY --from=builder --chown=nextjs:nodejs /app/public ./public -COPY --from=builder /app/prisma ./prisma -COPY --from=builder /app/scripts ./scripts -COPY --from=builder /app/generated ./generated +# 用官方 node 镜像自带的 node 用户即可,少一层自建用户逻辑 +COPY --from=builder --chown=node:node /app/public ./public -# Automatically leverage output traces to reduce image size -# https://nextjs.org/docs/advanced-features/output-file-tracing -COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ -COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +# Next 运行时缓存/ISR 目录 +RUN mkdir .next && chown node:node .next -USER nextjs +# standalone 最小运行集 +COPY --from=builder --chown=node:node /app/.next/standalone ./ +COPY --from=builder --chown=node:node /app/.next/static ./.next/static -EXPOSE 3000 +# 只有当运行时真的需要这些文件时才复制 +# COPY --from=builder --chown=node:node /app/prisma ./prisma +# COPY --from=builder --chown=node:node /app/generated ./generated +# COPY --from=builder --chown=node:node /app/scripts ./scripts -ENV HOSTNAME=0.0.0.0 -ENV PORT=3000 +USER node +EXPOSE 3000 -CMD ["pnpm", "start-docker"] +CMD ["node", "server.js"] diff --git a/package.json b/package.json index 76b1e1fa95..5df6eb5748 100644 --- a/package.json +++ b/package.json @@ -67,8 +67,8 @@ "@dicebear/core": "^9.2.3", "@fontsource/inter": "^5.2.8", "@hello-pangea/dnd": "^17.0.0", - "@prisma/adapter-pg": "^6.18.0", - "@prisma/client": "^6.18.0", + "@prisma/adapter-pg": "^6", + "@prisma/client": "^6", "@prisma/extension-read-replicas": "^0.4.1", "@react-spring/web": "^10.0.3", "@svgr/cli": "^8.1.0", @@ -102,12 +102,12 @@ "kafkajs": "^2.1.0", "lucide-react": "^0.543.0", "maxmind": "^5.0.0", - "next": "^15.5.9", + "next": "^16", "node-fetch": "^3.2.8", "npm-run-all": "^4.1.5", "papaparse": "^5.5.3", "pg": "^8.16.3", - "prisma": "^6.18.0", + "prisma": "^6", "pure-rand": "^7.0.1", "react": "^19.2.3", "react-dom": "^19.2.3",