From bc5cb7a5331969276154f24f455573d25bb29653 Mon Sep 17 00:00:00 2001 From: asgerzhou Date: Tue, 28 Jul 2026 11:42:54 +0800 Subject: [PATCH] =?UTF-8?q?feat(docker):=20=E6=B7=BB=E5=8A=A0=E5=A4=9A?= =?UTF-8?q?=E9=98=B6=E6=AE=B5=E6=9E=84=E5=BB=BADockerfile=E5=8F=8A?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dockerfile | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ gitpush.sh | 1 + 2 files changed, 64 insertions(+) create mode 100644 dockerfile create mode 100644 gitpush.sh diff --git a/dockerfile b/dockerfile new file mode 100644 index 0000000..aeabe19 --- /dev/null +++ b/dockerfile @@ -0,0 +1,63 @@ +# 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"] \ No newline at end of file diff --git a/gitpush.sh b/gitpush.sh new file mode 100644 index 0000000..c16bb01 --- /dev/null +++ b/gitpush.sh @@ -0,0 +1 @@ +git push origin main && git push gitea main \ No newline at end of file