Docker部署Node应用至Heroku失败:无法找到模块'/app/heroku'
解决Docker化Node.js应用部署到Heroku后的H10错误与模块找不到问题
核心问题分析
- 错误
Cannot find module '/app/heroku'源于Heroku Node.js buildpack与Docker部署逻辑冲突:默认Node buildpack会忽略你的Docker配置,按照自身规则尝试启动应用,导致执行了错误的启动命令。 - 直接用
node ./src/index.ts启动无效,Node本身不支持直接运行TypeScript文件,必须先编译为JS或用ts-node解析。
分步解决方案
1. 切换Heroku Buildpack为Container类型
部署Docker应用时,Heroku必须使用Container buildpack,而非默认的Node.js buildpack:
- 命令行操作:
heroku buildpacks:set container -a your-app-name - 控制台操作:进入应用Settings → Buildpacks,移除Node.js buildpack,添加
Containerbuildpack。
2. 修复TypeScript文件的启动方式
Node无法直接执行.ts文件,二选一即可:
方案A:提前编译TypeScript为JavaScript
- 在
package.json中添加编译脚本和TypeScript依赖:{ "scripts": { "build": "tsc", "start": "node ./dist/index.js" }, "devDependencies": { "typescript": "^5.x" } } - 新增
tsconfig.json配置编译输出(示例):{ "compilerOptions": { "outDir": "./dist", "target": "ES2020", "module": "CommonJS" }, "include": ["src/**/*"] } - 修改Dockerfile,加入编译步骤:
FROM node:20 AS base WORKDIR /app COPY package.json package-lock.json ./ RUN npm install COPY . . RUN npm run build CMD ["node", "./dist/index.js"]
方案B:使用ts-node直接运行
- 在
package.json中添加ts-node依赖和启动脚本:{ "scripts": { "start": "ts-node ./src/index.ts" }, "dependencies": { "ts-node": "^10.x", "typescript": "^5.x" } } - 修改Dockerfile的启动命令:
FROM node:20 AS base WORKDIR /app COPY package.json package-lock.json ./ RUN npm install COPY . . CMD ["npx", "ts-node", "./src/index.ts"]
3. 清理无用依赖
从package.json的dependencies中移除heroku包——这是Heroku CLI工具,应用运行完全不需要它。
验证部署
重新触发GitHub Actions部署,完成后查看Heroku日志:
heroku logs --tail -a your-app-name
确认日志中出现服务启动成功的信息(比如GraphQL Yoga监听4000端口),再访问应用即可正常打开。
内容的提问来源于stack exchange,提问作者Ryan Doherty
相关产品推荐
相关产品推荐

