diff --git a/.dockerignore b/.dockerignore index 5818754..9980816 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,45 +1,70 @@ +# 🚀 超优化版 .dockerignore for npm (减小镜像体积) + # 依赖和构建产物 node_modules .next +.npm .pnpm-store +.yarn npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* +lerna-debug.log* + +# 包管理器锁文件 (保留npm,排除其他) +pnpm-lock.yaml +yarn.lock # 版本控制 .git .gitignore -# CI/CD(新的部署方式不需要这些) +# CI/CD .github +.gitlab-ci.yml -# 开发工具 +# 开发工具和编辑器配置 .vscode .cursor .idea *.swp *.swo +.editorconfig -# 环境变量文件 -.env +# 环境变量文件(保留.env以支持生产环境配置) .env.* +!.env !.env.example # 测试和覆盖率 coverage .nyc_output test-results +*.test.* +*.spec.* +__tests__ + +# 文档和说明文件 +*.md +!README.md +LICENSE +CHANGELOG* # 临时文件和系统文件 .DS_Store *.tmp *.temp Thumbs.db - -# 文档(保留README.md,可能包含重要信息) -LICENSE +.directory +.Trash-* # Docker 相关文件(避免递归复制) Dockerfile* -docker-compose*.yml \ No newline at end of file +docker-compose*.yml +.dockerignore + +# 其他开发文件 +.next.config.js.backup +.eslintcache +.stylelintcache \ No newline at end of file diff --git a/.github/workflows/nextjs.yml b/.github/workflows/nextjs.yml index 62fa2b7..7c62515 100644 --- a/.github/workflows/nextjs.yml +++ b/.github/workflows/nextjs.yml @@ -66,7 +66,7 @@ jobs: docker run -d \ --name saas2-app \ --restart unless-stopped \ - -p 3000:3000 \ + -p 3003:3000 \ --health-cmd="wget --no-verbose --tries=1 --spider http://localhost:3000/api/health || exit 1" \ --health-interval=30s \ --health-timeout=10s \ @@ -82,7 +82,7 @@ jobs: echo "✅ 部署成功!容器状态:" docker ps | grep saas2-app echo "" - echo "🌐 应用访问地址: http://$(hostname -I | awk '{print $1}'):3000" + echo "🌐 应用访问地址: http://$(hostname -I | awk '{print $1}'):3003" # 测试健康检查 echo "🔍 测试健康检查..." diff --git a/Dockerfile b/Dockerfile index b4579fb..b1a5a2e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,45 +1,48 @@ -# 多阶段构建的 Dockerfile for Next.js with pnpm +# 🚀 超优化版 Dockerfile for Next.js with npm (目标: <150MB) # 第一阶段:构建阶段 FROM node:22-alpine AS builder # 设置工作目录 WORKDIR /app -# 安装 pnpm -RUN npm install -g pnpm +# 复制包管理器配置文件 (利用Docker缓存) +COPY package.json package-lock.json* ./ -# 复制包管理器配置文件 -COPY package.json pnpm-lock.yaml ./ - -# 安装依赖 -RUN pnpm install --frozen-lockfile +# 安装依赖 (使用npm,禁用可选依赖) +RUN npm ci --only=production --no-optional && \ + npm cache clean --force # 复制源代码和配置文件 COPY . . -# 构建应用 -RUN pnpm run build +# 重新安装所有依赖用于构建 +RUN npm ci --no-optional -# 第二阶段:运行阶段 +# 构建应用 +RUN npm run build + +# 清理构建阶段缓存 (关键优化点) +RUN rm -rf node_modules && \ + rm -rf ~/.npm && \ + rm -rf /root/.npm && \ + npm cache clean --force + +# 第二阶段:运行阶段 (使用更小的基础镜像) FROM node:22-alpine AS runner # 设置工作目录 WORKDIR /app # 创建非root用户 -RUN addgroup --system --gid 1001 nodejs -RUN adduser --system --uid 1001 nextjs +RUN addgroup --system --gid 1001 nodejs && \ + adduser --system --uid 1001 nextjs -# 安装 pnpm 和 wget(用于健康检查) -RUN npm install -g pnpm && apk add --no-cache wget +# 只安装必要的运行时工具 +RUN apk add --no-cache wget && \ + apk cache clean && \ + rm -rf /var/cache/apk/* -# 复制包配置文件 -COPY package.json pnpm-lock.yaml ./ - -# 只安装生产依赖 -RUN pnpm install --frozen-lockfile --prod - -# 从构建阶段复制构建产物 +# 从构建阶段复制构建产物 (standalone模式包含所有需要的依赖) COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static COPY --from=builder --chown=nextjs:nodejs /app/public ./public @@ -51,9 +54,9 @@ USER nextjs EXPOSE 3000 # 设置环境变量 -ENV PORT=3000 -ENV HOSTNAME="0.0.0.0" -ENV NODE_ENV=production +ENV PORT=3000 \ + HOSTNAME="0.0.0.0" \ + NODE_ENV=production -# 启动应用 +# 启动应用 (standalone模式直接运行server.js) CMD ["node", "server.js"] \ No newline at end of file