部署NestJS应用至Cloud Run时出现模块找不到错误
解决NestJS部署Cloud Run的模块找不到与端口监听问题
核心问题分析
- 模块找不到错误:
Error: Cannot find module '/var/app/src/main.js'说明容器内执行node src/main.js时目标路径不存在。NestJS编译后,dist目录结构由tsconfig.json的outDir配置决定——若outDir设为dist,编译后的入口文件通常是dist/main.js,而非dist/src/main.js。 - 端口监听不匹配:Cloud Run会自动注入
PORT环境变量,应用必须监听该端口才能被检测到就绪状态,而非你自定义的APP_PORT。
修复步骤
1. 修正Dockerfile的入口命令与文件复制逻辑
调整CMD指令和dist目录复制方式,确保入口文件路径正确:
FROM node:22.13.1-alpine3.21 AS build WORKDIR /var/app COPY package.json package-lock.json ./ RUN CI=true npm install COPY . . RUN npx prisma generate RUN npm run build FROM node:22.13.1-alpine3.21 WORKDIR /var/app ENV NODE_ENV=production # 复制编译后的产物到容器内的dist目录 COPY --from=build /var/app/dist ./dist COPY --from=build /var/app/node_modules ./node_modules COPY --from=build /var/app/package.json ./ COPY --from=build /var/app/package-lock.json ./ RUN npm prune --omit=dev # 监听Cloud Run自动分配的PORT变量 EXPOSE ${PORT} # 入口文件路径改为编译后的dist/main.js CMD ["node", "dist/main.js"]
2. 让NestJS应用监听Cloud Run的PORT变量
修改src/main.ts,确保应用读取PORT环境变量:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 优先读取Cloud Run的PORT变量,本地测试 fallback 到3001 const port = process.env.PORT || 3001; await app.listen(port); } bootstrap();
3. 验证镜像内的文件结构
本地运行镜像后进入容器,确认文件路径是否正确:
# 启动本地镜像 docker run -it --rm your-image-name sh # 查看/var/app目录结构 ls -la /var/app # 确认dist目录下存在main.js ls -la /var/app/dist
4. 检查Cloud Run部署配置
- 无需硬编码容器端口,Cloud Run会根据
PORT变量自动匹配监听端口。 - 确认持续部署触发的是最新构建的镜像版本。
额外注意事项
- 检查
tsconfig.json的outDir配置,确保编译产物输出到dist目录:{ "compilerOptions": { "outDir": "./dist", // 其他配置项 } }
内容的提问来源于stack exchange,提问作者Alvaro J Vanegas
相关产品推荐
相关产品推荐

