Docker部署Next.js14项目报错:Cannot find module 'next'求助
问题分析与解决方案
核心问题
- Yarn版本不一致:仅在builder阶段设置了Yarn 4,但installer/runner阶段未配置,导致依赖安装使用系统默认的Yarn 1.x,无法正确解析Yarn 4的lockfile,依赖安装不完整。
- Turbo构建流程错误:builder阶段先安装全量依赖再执行
turbo prune,不符合Turbo分层构建规范,导致生成的out目录依赖缺失。 - 文件复制路径错误:runner阶段复制standalone文件的路径与Next.js 14的输出结构不匹配,启动时找不到依赖模块。
修改后的Dockerfile
# Builder阶段:生成依赖清单和构建产物 FROM node:20-alpine AS builder RUN apk add --no-cache libc6-compat WORKDIR /app # 启用Corepack并指定Yarn 4.3.1版本 RUN corepack enable RUN yarn set version 4.3.1 # 仅复制必要配置文件,避免缓存失效 COPY package.json yarn.lock ./ COPY turbo.json turbo.json COPY apps/web/package.json apps/web/package.json # 执行Turbo Prune生成最小依赖集 RUN yarn dlx turbo prune --scope=web --docker # Installer阶段:安装生产依赖并构建 FROM node:20-alpine AS installer RUN apk add --no-cache libc6-compat WORKDIR /app # 同步Yarn版本 RUN corepack enable RUN yarn set version 4.3.1 # 复制prune生成的依赖文件 COPY --from=builder /app/out/json/ . COPY --from=builder /app/out/yarn.lock ./yarn.lock COPY --from=builder /app/out/full/ . COPY turbo.json turbo.json # 仅安装生产依赖 RUN yarn install --production=true # 执行应用构建 RUN yarn dlx turbo run build --filter=web... # Runner阶段:运行应用 FROM node:20-alpine AS runner WORKDIR /app # 创建非特权用户 RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs USER nextjs # 复制standalone构建产物和静态资源 COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/standalone/ ./ COPY --from=installer --chown=nextjs:nodejs /app/apps/web/public ./apps/web/public COPY --from=installer --chown=nextjs:nodejs /app/apps/web/.next/static ./apps/web/.next/static EXPOSE 3000 ENV PORT=3000 # Next.js 14 standalone的启动文件位于根目录 CMD node server.js
关键修改说明
- 统一Yarn版本:在builder、installer阶段均配置Corepack和指定Yarn 4.3.1,确保全流程使用相同包管理器,避免依赖解析差异。
- 优化Turbo流程:先复制必要配置文件再执行
turbo prune,生成最小化依赖集,减少构建体积和冗余。 - 修正启动路径:Next.js 14的standalone构建将
server.js输出到apps/web/.next/standalone/根目录,因此启动命令改为node server.js。 - 生产依赖安装:添加
--production=true参数,仅安装生产依赖,缩小镜像体积。
额外排查步骤
- 验证Yarn版本:在installer阶段添加
RUN yarn --version,确认输出为4.3.1。 - 检查目录结构:构建后进入installer临时容器,查看
/app/apps/web/.next/standalone/下是否存在server.js和完整node_modules。 - 确认Next.js配置:确保
next.config.js启用standalone模式:/** @type {import('next').NextConfig} */ const nextConfig = { output: 'standalone', // 其他配置项 } module.exports = nextConfig
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

