NestJS项目部署至K8s后无法正常启动,请求排查配置问题
NestJS项目部署K8s后无启动成功提示问题
本地执行以下命令可正常启动项目:
npm run start:test
但部署到K8s服务器后,日志仅输出:
[10:44:59 PM] Starting compilation in watch mode...
[10:45:22 PM] Found 0 errors. Watching for file changes.
之后无后续启动成功提示,项目无法正常运行。
Dockerfile配置
FROM node:16 AS builder # Create app directory WORKDIR /app ENV NODE_ENV='prod' # A wildcard is used to ensure both package.json AND package-lock.json are copied COPY package*.json ./ COPY tsconfig.build.json ./ COPY tsconfig.json ./ COPY ca-cert.pem ./ COPY prisma ./prisma/ COPY protos ./protos/ # Install app dependencies RUN npm install RUN npx prisma generate COPY . . RUN npm run build FROM node:16-alpine COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package*.json ./ COPY --from=builder /app/dist ./dist COPY --from=builder /app/protos ./protos COPY --from=builder /app/tsconfig.build.json ./ COPY --from=builder /app/tsconfig.json ./ COPY --from=builder /app/prisma ./prisma COPY --from=builder /app/ca-cert.pem ./ EXPOSE 3190 CMD [ "npm", "run", "start:test" ]
package.json启动脚本配置
"start:test": "nest start --watch", "start:dev": "set NODE_ENV=dev && nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "nest start"
问题
是否遗漏了某些配置?
问题原因及解决方法
问题核心是启动命令不适合容器部署环境:
--watch模式不适用于部署场景nest start --watch是开发环境的热重载模式,会持续监听本地文件变化触发重编译。但容器中dist目录是编译好的静态产物,没有文件变动触发,进程会一直卡在监听状态,不会启动服务。应直接运行编译后的产物
Dockerfile已经通过npm run build生成了dist目录,无需再执行编译流程,直接运行成品即可。
具体修改方案
修改Dockerfile的启动命令
将原CMD替换为生产模式启动命令:CMD [ "npm", "run", "start:prod" ]或者更高效地直接运行编译后的主文件:
CMD [ "node", "dist/main.js" ]优化
start:prod脚本
当前start:prod的nest start会重复执行编译步骤,改为直接运行成品:"start:prod": "node dist/main.js"补充运行环境的NODE_ENV配置
在node:16-alpine阶段添加环境变量,保证运行环境一致性:ENV NODE_ENV='prod'
修改后,容器启动时会直接运行编译好的服务,不再停留在监听模式,即可正常输出启动日志并对外提供服务。
内容的提问来源于stack exchange,提问作者Erika
相关产品推荐
相关产品推荐

