Nextjs 无法在生产 node_env 的“.next”目录中找到有效的构建

Posted

技术标签:

【中文标题】Nextjs 无法在生产 node_env 的“.next”目录中找到有效的构建【英文标题】:Nextjs fails to find valid build in the '.next' directory in production node_env 【发布时间】:2018-09-15 12:15:32 【问题描述】:

我在 docker 中运行我的应用程序,但我的生产构建和启动脚本仅在 docker 环境中失败。虽然 node_env 开发在 docker 环境中运行良好。

这是我无法进行生产构建和启动服务器的脚本。我正在使用 nodemon 和 babel

"build:prod": 
      "command": "babel ./src/server/ -d server --presets es2015,stage-2 && next build src",
      "env": 
        "NODE_ENV": "production"
      
    ,
    "start:prod": 
      "command": "PORT=3000 nodemon --watch ./src/server/ ./src/server/server.js --exec babel-node --presets es2015,stage-2",
      "env": 
        "NODE_ENV": "production"
      
    

但是当我在 docker 环境中给出相同的命令时:

FROM node:8-alpine

COPY package.json /tmp/package.json

RUN cd /tmp && npm install

RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app

WORKDIR /opt/app

ADD . /opt/app

RUN npm run build:prod

EXPOSE 3000

CMD ["npm", "run", "start:prod"]

我在 docker 中收到以下错误:

 > better-npm-run start:prod
site_1      | 
site_1      | running better-npm-run in /opt/app
site_1      | Executing script: start:prod
site_1      | 
site_1      | to be executed: PORT=3000 NODE_ENV=production nodemon --watch ./src/server/ ./src/server/server.js --exec babel-node --presets es2015,stage-2 
site_1      | [nodemon] 1.17.3
site_1      | [nodemon] to restart at any time, enter `rs`
site_1      | [nodemon] watching: /opt/app/src/server/**/*
site_1      | [nodemon] starting `babel-node ./src/server/server.js --presets es2015,stage-2`
site_1      | false 'production'
site_1      | > Could not find a valid build in the '.next' directory! Try building your app with 'next build' before starting the server.
site_1      | [nodemon] app crashed - waiting for file changes before starting...

我会很感激任何帮助,并且很高兴知道我做错了什么。

【问题讨论】:

您是否尝试将next build src 位添加到 prod 命令? 为什么使用nodemon 而不是next start 命令? 您解决了这个问题了吗?我的 docker-compose 没有在 docker 文件中构建 .next 尝试将生产目录从 .next 更改为没有开始时间的目录,可能是 _next 为什么要复制安装node_modules到/tmp,然后复制回WORKDIR?通常,WORKDIR 在运行 dockerfile 命令时会自动创建目录。还有,你在构建docker镜像的时候有没有查看消息,有没有异常消息? 【参考方案1】:

您需要确保.next 目录没有从您的主机复制

ADD . /opt/app

还将添加您在主机上的.next 目录。我会添加.dockerignore 并添加.next。然后再次构建并运行

【讨论】:

已经完成了。它从一开始就没有上传到 docker 环境中。 那么你需要提供一个最小的 repo 来重现问题【参考方案2】:

随着时间的推移,这个问题已经获得了相当多的额外投票,让我详细说明一下您在面对上述问题时可能需要考虑的一些事项。

版本

请参考官方docs,其中 Vercel 列出了 Node.js 版本10.13 or later 作为要求。

使用强化图像进行生产

我还建议使用经过生产强化并被证明是安全的图像。使用像 Bitnami (why?, example) 之类的开源图像被认为是一种很好的做法。请注意,这将解决您的问题,因为现在您不再使用任何本地文件。

保证构建完整性

建议在您的.dockerignore 文件中忽略node_modules 以及任何构建工件(如.next),并在构建期间安装yarnnpm 的缓存文件夹。这样您就可以确保为您的图像生成具有正确操作系统绑定的node_modules

【讨论】:

【参考方案3】:

检查你的 .dockerignore

FROM node:latest

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install pm2 -g
ENV NPM_CONFIG_LOGLEVEL warn
RUN npm install --production

# Show current folder structure in logs
RUN ls -al -R

# Bundle app source
COPY . .

EXPOSE 8080

CMD [ "npm", "start" ]

【讨论】:

【参考方案4】:

对于使用 nextjs 的生产,请使用以下命令

npm run build && npm run start

【讨论】:

以上是关于Nextjs 无法在生产 node_env 的“.next”目录中找到有效的构建的主要内容,如果未能解决你的问题,请参考以下文章

NextJS:生产中未定义的上下文值(在开发中工作正常)

无法让 NODE_ENV 在开班时粘在我的 MEAN 堆栈上

Heroku NODE_ENV 为我设置为开发而不是生产

React Native - “您当前正在使用 NODE_ENV 之外的缩小代码 === “生产” “

Heroku:process.env.NODE_ENV 未注册为“生产”(它注册为“开发”)

NextJS 在生产构建中错误的 CSS 顺序