Yarn Berry+Next.js转Standalone构建后Docker运行模块缺失报错求助
解决Next.js Yarn Berry Standalone构建Docker运行时模块缺失问题
问题场景
使用Yarn Berry管理依赖的Next.js项目,Docker Standalone镜像构建成功,但运行时抛出Cannot find module 'next/dist/server/next-server'错误。
报错原因
Yarn Berry采用PnP(Plug'n'Play)机制管理依赖,依赖文件存储在.yarn/cache目录,且需要通过PnP loader解析模块路径。原Dockerfile的runner阶段未复制Yarn Berry核心配置文件与依赖缓存,直接用node server.js启动时无法加载PnP loader,导致Next.js核心模块无法被识别。
解决方案
修改Dockerfile的runner阶段,复制Yarn Berry必要文件,并通过Yarn启动服务(自动加载PnP loader):
修改后的完整Dockerfile
FROM node:16-alpine as builder WORKDIR /app COPY package.json ./ COPY yarn.lock ./ COPY .pnp.cjs ./ COPY .pnp.loader.mjs ./ COPY .yarnrc.yml ./ COPY .yarn .yarn RUN yarn install --immutable COPY . . ARG GITHUB_SHA=0 RUN yarn build FROM node:16-alpine AS runner WORKDIR /app RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs USER nextjs # 复制Yarn Berry依赖管理核心文件 COPY --from=builder --chown=nextjs:nodejs /app/.pnp.cjs ./ COPY --from=builder --chown=nextjs:nodejs /app/.pnp.loader.mjs ./ COPY --from=builder --chown=nextjs:nodejs /app/.yarnrc.yml ./ COPY --from=builder --chown=nextjs:nodejs /app/.yarn .yarn COPY --from=builder --chown=nextjs:nodejs /app/package.json ./ # 复制Next.js静态资源与Standalone构建产物 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 ENV NODE_ENV='production' # 通过Yarn启动服务,自动加载PnP loader CMD ["yarn", "run", "start"]
额外配置检查
- 确保
package.json中存在start脚本:
"scripts": { "start": "node server.js", "build": "next build" }
- 确保
next.config.js已启用Standalone输出:
/** @type {import('next').NextConfig} */ const nextConfig = { output: 'standalone', } module.exports = nextConfig
替代启动方式(可选)
若不想通过Yarn启动,可直接用node命令并指定加载PnP loader:
CMD ["node", "--require", "./.pnp.cjs", "server.js"]
内容的提问来源于stack exchange,提问作者Noel
相关产品推荐
相关产品推荐

