You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 10.0.5 Docker部署报错:/opt/app/.next目录下找不到生产构建产物

问题根因

  1. package.json中build:app脚本的环境变量作用范围错误:
    当前写法cross-env NODE_ENV=production rm -rf .next && APP_TENANT_CODE=app && next build中,cross-env设置的NODE_ENV=production仅对前面的rm -rf .next命令生效,后续执行next build时未携带NODE_ENV=production参数,可能导致next以开发模式构建,未生成生产环境要求的.next目录产物。
  2. 临时环境变量赋值逻辑错误:
    APP_TENANT_CODE=app && next build的写法在Alpine默认的sh shell中,APP_TENANT_CODE变量不会作用于后续的next build命令,可能导致构建逻辑异常未输出产物。
  3. 自定义启动脚本存在冗余逻辑:
    Next.js 10.0.5版本的startServer方法内部已经完成了服务初始化逻辑,你后续调用的await app.prepare()属于重复初始化,可能触发目录校验异常。
  4. 若你在next.config.js中配置了自定义distDir参数,会修改默认构建输出路径,启动时就无法在默认的.next目录找到产物。

修复方案

  1. 修正package.json的build:app脚本,统一环境变量作用范围:
"build:app": "cross-env NODE_ENV=production APP_TENANT_CODE=app rm -rf .next && next build"
  1. 调整start.js启动逻辑,移除冗余的prepare调用:
async function main() {
  const port = process.env.PORT || 3000
  const dir = path.resolve(__dirname, '..')
  const hostname = '0.0.0.0'

  // 启动应用
  await startServer({ dir }, port, hostname)
  console.log(`started server on http://${hostname}:${port}`)
}
  1. 校验构建产物是否正常生成:
    在Dockerfile的RUN npm run build:app后新增一行RUN ls -la .next,镜像构建时可确认.next目录是否存在,以及目录下是否有BUILD_ID文件(Next.js生产构建的必填标识文件)。
  2. 确认next.config.js配置:
    如果配置了非.next的自定义输出目录,需要在startServer参数中指定对应目录,或者将distDir改回默认的.next。

可选优化

Dockerfile中npm ci后再执行npm install --dev属于冗余操作,可直接替换为RUN npm ci --include=dev一次性安装全量依赖,减少镜像层体积。

内容的提问来源于stack exchange,提问作者rehan007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:54:03