From 118149b47bb40dac57153670d540fb7079a45d1d Mon Sep 17 00:00:00 2001 From: luorijun Date: Sat, 19 Apr 2025 16:28:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20Dockerfile=EF=BC=8C?= =?UTF-8?q?=E8=B0=83=E6=95=B4=20nextjs=20=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ next.config.ts | 13 +++++++++- 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f6bc867 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,64 @@ +# 基础阶段:安装依赖和构建应用 +FROM node:20-alpine AS base + +# 安装 pnpm +RUN corepack enable && corepack prepare pnpm@10.5.2 --activate + +# 安装构建依赖项 +RUN apk add --no-cache libc6-compat +WORKDIR /app + +# 依赖缓存阶段 +FROM base AS deps +COPY package.json pnpm-lock.yaml* ./ +RUN pnpm fetch --prod +RUN pnpm install --frozen-lockfile --prod + +# 构建阶段 +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# 环境变量设置 +ENV NEXT_TELEMETRY_DISABLED 1 +ENV NODE_ENV production + +# 构建应用 +RUN pnpm build + +# 生产阶段 +FROM node:20-alpine AS runner +WORKDIR /app + +# 环境变量设置 +ENV NODE_ENV production +ENV NEXT_TELEMETRY_DISABLED 1 + +# 添加非 root 用户 +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +# 复制必要文件 +COPY --from=builder /app/public ./public + +# 设置适当的权限 +RUN mkdir .next +RUN chown -R nextjs:nodejs .next + +# 复制构建产物 +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +# 切换到非 root 用户 +USER nextjs + +# 暴露端口 +EXPOSE 3000 + +# 设置环境变量 +ENV PORT 3000 +ENV HOSTNAME "0.0.0.0" + +# 启动命令 +CMD ["node", "server.js"] \ No newline at end of file diff --git a/next.config.ts b/next.config.ts index 3b84f68..1d28446 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,18 @@ import type { NextConfig } from "next" const nextConfig: NextConfig = { - /* config options here */ + poweredByHeader: false, + reactStrictMode: true, + swcMinify: true, + output: "standalone", + images: { + minimumCacheTTL: 60, + formats: ["image/webp"], + }, + experimental: { + optimizeCss: true, + serverComponentsExternalPackages: [], + }, } export default nextConfig