You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署NestJS应用至Cloud Run时出现模块找不到错误

解决NestJS部署Cloud Run的模块找不到与端口监听问题

核心问题分析

  1. 模块找不到错误: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。
  2. 端口监听不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:13:12