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

部署Firebase Functions时Cloud Run容器健康检查失败问题排查

Node.js 18第二代Firebase Functions容器启动失败问题解决

问题背景

部署Node.js 18(第二代)Firebase Functions的addCourseData函数时,触发容器健康检查失败错误,提示容器未监听PORT=8080环境变量指定的端口。新增process.env.K_SERVICE判断逻辑后出现此问题,此前无该逻辑时部署运行正常。

部署错误日志

i  functions: creating Node.js 18 (2nd Gen) function addCourseData(us-central1)...
Could not create or update Cloud Run service addcoursedata, Container Healthcheck failed. Revision 'addcoursedata-00001-cup' 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. Logs for this revision might contain more information.

Logs URL: https://console.cloud.google.com/logs/viewer?project=PROJECT_ID&resource=cloud_run_revision/service_name/addcoursedata/revision_name/addcoursedata-00001-cup&advancedFilter=resource.type%3D%22cloud_run_revision%22%0Aresource.labels.service_name%3D%22addcoursedata%22%0Aresource.labels.revision_name%3D%22addcoursedata-00001-cup%22
For more troubleshooting guidance, see https://cloud.google.com/run/docs/troubleshooting#container-failed-to-start

Functions deploy had errors with the following functions:
        addCourseData(us-central1)
i  functions: cleaning up build files...

--debug模式日志

Total Function Deployment time: 67749
[] 1 Functions Deployed
[] 1 Functions Errored
[] 0 Function Deployments Aborted
[] Average Function Deployment time: 67748

Functions deploy had errors with the following functions:
        addCourseData(us-central1)
[] Not printing URL for HTTPS function. Typically this means it didn't match a filter or we failed deployment

Functions deploy failed.
[] {
  "endpoint": {
    "id": "addCourseData",
    "project": "PROJECT_ID",
    "region": "us-central1",
    "entryPoint": "addCourseData",
    "platform": "gcfv2",
    "runtime": "nodejs18",
    "httpsTrigger": {},
    "labels": {
      "deployment-tool": "cli-firebase"
    },
    "serviceAccount": null,
    "ingressSettings": null,
    "availableMemoryMb": null,
    "timeoutSeconds": null,
    "maxInstances": null,
    "minInstances": null,
    "concurrency": 80,
    "vpc": null,
    "environmentVariables": {
      "FIREBASE_CONFIG": "{\"projectId\":\"PROJECT_ID\",\"databaseURL\":\"https://PROJECT_ID-default-rtdb.asia-southeast1.firebasedatabase.app\",\"storageBucket\":\"PROJECT_ID.appspot.com\"}",
      "GCLOUD_PROJECT": "PROJECT_ID",
      "EVENTARC_CLOUD_EVENT_SOURCE": "projects/PROJECT_ID/locations/us-central1/services/addCourseData"
    },
    "codebase": "default",
    "securityLevel": "SECURE_ALWAYS",
    "cpu": 1,
    "targetedByOnly": true,
    "hash": "38475170b79b25f455db5cacbdc1d6c36adc4679"
  },
  "op": "update",
  "original": {
    "name": "FirebaseError",
    "children": [],
    "exit": 1,
    "message": "Could not create or update Cloud Run service addcoursedata, Container Healthcheck failed. Revision 'addcoursedata-00001-sox' 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. Logs for this revision might contain more information.\n\nLogs URL: https://console.cloud.google.com/logs/viewer?project=PROJECT_ID&resource=cloud_run_revision/service_name/addcoursedata/revision_name/addcoursedata-00001-sox&advancedFilter=resource.type%3D%22cloud_run_revision%22%0Aresource.labels.service_name%3D%22addcoursedata%22%0Aresource.labels.revision_name%3D%22addcoursedata-00001-sox%22 \nFor more troubleshooting guidance, see https://cloud.google.com/run/docs/troubleshooting#container-failed-to-start",
    "status": 3,
    "code": 3
  }
}
[] Error: Failed to update function addcourseData in region us-central1
    at C:\Users\USER_ABC\AppData\Roaming\npm\node_modules\firebase-tools\lib\deploy\functions\release\fabricator.js:51:11
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Fabricator.updateV2Function (C:\Users\USER_ABC\AppData\Roaming\npm\node_modules\firebase-tools\lib\deploy\functions\release\fabricator.js:380:32)
    at async Fabricator.updateEndpoint (C:\Users\USER_ABC\AppData\Roaming\npm\node_modules\firebase-tools\lib\deploy\functions\release\fabricator.js:153:13)
    at async handle (C:\Users\USER_ABC\AppData\Roaming\npm\node_modules\firebase-tools\lib\deploy\functions\release\fabricator.js:88:17)

Error: There was an error deploying functions

用户代码

const calledFunctionName = process.env.K_SERVICE;
if (!calledFunctionName || calledFunctionName === "addCourseData") {
  const {onRequest} = require("firebase-functions/v2/https");

  // Take the email and adds an entry to Firestore with Course data
  exports.addCourseData = onRequest(async (request, response) => {
    return await (await require("./my-functions/course/add-course-data-function"))
        .addCourseData(request, response);
  });
}

问题原因

第二代Firebase Functions基于Cloud Run运行,部署阶段不会注入K_SERVICE环境变量,该变量仅在函数实际运行时才会被设置。你的代码在模块顶层用K_SERVICE做条件判断,导致部署时exports.addCourseData根本没有被定义,Cloud Run启动器找不到函数入口,无法启动服务监听端口,最终触发健康检查失败。

修复方案

调整逻辑,确保函数入口始终在模块顶层导出,把冷启动优化的延迟加载逻辑放到函数内部执行:

修正后的代码

// 顶层直接导入并导出函数入口,保证部署工具能识别
const {onRequest} = require("firebase-functions/v2/https");

exports.addCourseData = onRequest(async (request, response) => {
  // 仅在函数被触发时检查服务名称并加载依赖,实现冷启动优化
  const calledFunctionName = process.env.K_SERVICE;
  if (!calledFunctionName || calledFunctionName === "addCourseData") {
    return await (await require("./my-functions/course/add-course-data-function"))
        .addCourseData(request, response);
  }
  response.status(400).send("无效的函数触发");
});

核心要点

  • 第二代Firebase Functions要求函数必须在模块顶层导出,不能用条件判断包裹exports语句,否则部署工具无法检测到函数存在,生成的Cloud Run配置会缺失服务入口。
  • 冷启动优化的正确姿势是延迟加载依赖到函数内部,而不是在模块顶层做条件判断。

为什么之前正常?

之前没有K_SERVICE判断时,函数入口直接在模块顶层导出,部署工具能正常识别函数,生成的Cloud Run容器可以正确启动并监听端口,因此部署成功。

内容的提问来源于stack exchange,提问作者eagle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:28:10