我在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...
我很感激任何帮助,并且很高兴知道我做错了什么。
答案 0 :(得分:0)
您需要确保未从主机
复制.next
目录
ADD . /opt/app
还会添加您在主机上的.next
目录。我会添加.dockerignore
并添加.next
。然后再构建并运行
答案 1 :(得分:0)
随着时间的流逝,该问题获得了更多的选票,让我详细说明一下面对上述问题时可能要考虑的一些事情。
版本
请参考官方的docs,其中Vercel列出了Node.js版本10.13 or later
的要求。
使用强化图像进行制作
我还建议使用经过生产加固并证明是安全的图像。使用像Bitnami(why?,example)这样的开源图像被认为是一种好习惯。请注意,这将解决您的问题,因为现在您不再使用任何本地文件。
保证构建完整性
建议忽略node_modules
文件中的.next
以及.dockerignore
之类的任何构建工件,并在构建期间为yarn
或npm
安装缓存文件夹。这样一来,您可以确保使用正确的操作系统绑定为图像生成node_modules
。
答案 2 :(得分:0)
检查您的.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" ]
答案 3 :(得分:0)
对于使用 nextjs 的生产,请使用以下命令
npm run build && npm run start