Next.js 10.0.5 Docker部署报错:/opt/app/.next目录下找不到生产构建产物
问题根因
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目录产物。- 临时环境变量赋值逻辑错误:
APP_TENANT_CODE=app && next build的写法在Alpine默认的sh shell中,APP_TENANT_CODE变量不会作用于后续的next build命令,可能导致构建逻辑异常未输出产物。 - 自定义启动脚本存在冗余逻辑:
Next.js 10.0.5版本的startServer方法内部已经完成了服务初始化逻辑,你后续调用的await app.prepare()属于重复初始化,可能触发目录校验异常。 - 若你在
next.config.js中配置了自定义distDir参数,会修改默认构建输出路径,启动时就无法在默认的.next目录找到产物。
修复方案
- 修正
package.json的build:app脚本,统一环境变量作用范围:
"build:app": "cross-env NODE_ENV=production APP_TENANT_CODE=app rm -rf .next && next build"
- 调整
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}`) }
- 校验构建产物是否正常生成:
在Dockerfile的RUN npm run build:app后新增一行RUN ls -la .next,镜像构建时可确认.next目录是否存在,以及目录下是否有BUILD_ID文件(Next.js生产构建的必填标识文件)。 - 确认
next.config.js配置:
如果配置了非.next的自定义输出目录,需要在startServer参数中指定对应目录,或者将distDir改回默认的.next。
可选优化
Dockerfile中npm ci后再执行npm install --dev属于冗余操作,可直接替换为RUN npm ci --include=dev一次性安装全量依赖,减少镜像层体积。
内容的提问来源于stack exchange,提问作者rehan007
相关产品推荐
相关产品推荐

