我正在努力将 Nodejs 应用程序部署到 Google Cloud Run 上,这是一个用 Express 编写的 REST API 服务器。该应用程序已部署到Cloud Run,并且大约一年没有更新新版本。最近我做了一些修改,想要将新版本部署到 Cloud Run,但遇到错误。
Revision <revision-name> is not ready and cannot serve traffic. The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable
这是 GCP 日志记录上的错误消息
DEFAULT 2024-05-14T04:11:14.224328Z Error: Cannot find module '../config/firebase'
DEFAULT 2024-05-14T04:11:14.224332Z Require stack:
DEFAULT 2024-05-14T04:11:14.224339Z - /workspace/src/controller/floor.controller.js
DEFAULT 2024-05-14T04:11:14.224344Z - /workspace/src/routes/floor.routes.js
DEFAULT 2024-05-14T04:11:14.224350Z - /workspace/app.js
DEFAULT 2024-05-14T04:11:14.224356Z at Module._resolveFilename (node:internal/modules/cjs/loader:1224:15)
DEFAULT 2024-05-14T04:11:14.224361Z at Module._load (node:internal/modules/cjs/loader:1050:27)
DEFAULT 2024-05-14T04:11:14.224366Z at Module.require (node:internal/modules/cjs/loader:1310:19)
DEFAULT 2024-05-14T04:11:14.224371Z at require (node:internal/modules/helpers:179:18)
DEFAULT 2024-05-14T04:11:14.224403Z at Object.<anonymous> (/workspace/src/controller/floor.controller.js:1:12)
DEFAULT 2024-05-14T04:11:14.224407Z at Module._compile (node:internal/modules/cjs/loader:1480:14)
DEFAULT 2024-05-14T04:11:14.224412Z at Module._extensions..js (node:internal/modules/cjs/loader:1564:10)
DEFAULT 2024-05-14T04:11:14.224416Z at Module.load (node:internal/modules/cjs/loader:1287:32)
DEFAULT 2024-05-14T04:11:14.224421Z at Module._load (node:internal/modules/cjs/loader:1103:12)
DEFAULT 2024-05-14T04:11:14.224426Z at Module.require (node:internal/modules/cjs/loader:1310:19) {
DEFAULT 2024-05-14T04:11:14.224431Z code: 'MODULE_NOT_FOUND',
DEFAULT 2024-05-14T04:11:14.224437Z requireStack: [
DEFAULT 2024-05-14T04:11:14.224442Z '/workspace/src/controller/floor.controller.js',
DEFAULT 2024-05-14T04:11:14.224447Z '/workspace/src/routes/floor.routes.js',
DEFAULT 2024-05-14T04:11:14.224452Z '/workspace/app.js'
DEFAULT 2024-05-14T04:11:14.224457Z ]
DEFAULT 2024-05-14T04:11:14.224461Z }
错误消息说在我的源代码中找不到某些模块。但当我在本地环境中测试服务器时,它按预期运行(当然缺少的模块也在那里)。
我的
package.json
文件看起来像:
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"start": "node ./app.js",
"deploy": "gcloud run deploy api --allow-unauthenticated --source=.",
"local-serve": "nodemon app.js"
},
"engines": {
"node": "16"
},
"main": "app.js",
"dependencies": {
"axios": "^1.3.2",
"cors": "^2.8.5",
"crypto-js": "^4.1.1",
"express": "^4.18.2",
"firebase-admin": "^10.3.0",
"firebase-functions": "^4.2.1",
"http2-express-bridge": "^1.0.7"
},
"devDependencies": {
"@types/jest": "^29.4.0",
"firebase-functions-test": "^0.2.0",
"jest": "^29.5.0"
},
"private": true
}
this stackoverflow问题中的建议在
"gcp-build":""
'脚本中添加packaged.json
,但仍然遇到相同的错误。{
...,
"scripts": {
"start": "node ./app.js",
"deploy": "gcloud run deploy api --allow-unauthenticated --source=.",
"local-serve": "nodemon app.js",
"gcp-build":""
},
"engines": {
"node": "16"
},
...
}
0.0.0.0
和环境变量PORT
,但仍然无法解决问题。const PORT = process.env.PORT || 3001;
...
...
...
app.listen(PORT, '0.0.0.0', () => console.log(`server listening on port ${PORT}...`));
有人遇到过类似的情况吗?任何提示或建议都非常感谢!
如文档中所述,您的容器必须侦听由 Cloud Run 定义并在 $PORT 环境变量中提供的端口上传入的 HTTP 请求。
如果您的容器无法侦听预期端口,则修订版运行状况检查将失败,修订版将处于错误状态,并且流量将不会路由到它。例如,在带有 Express 的 Node.js 中,您应该使用:
// index.js
const port = process.env.PORT || 8080;
app.listen(port, () => {
console.log('Hello world listening on port', port);
});
// package.json
"engines": {
"node": "16.x"
},
"scripts": {
"start": "node index.js"
},
另请查看@FlightPlan 的Stackoverflow Link,它清楚地解释了端口问题与“容器无法启动”问题。查看他分享的故障排除步骤。
您可能会错过添加所需的依赖项。确保添加与节点版本兼容的所有依赖项。
有时重新启动程序可能需要一些时间。尝试等待几分钟,然后重新启动该程序。