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

如何在Cloud Run中运行一次性可执行任务(非Web服务)

在Cloud Run中运行一次性无Web服务任务的解决方案

问题背景

需要在Cloud Run中运行单个Node.js文件作为一次性可执行任务,无需搭建Web服务、监听端口。使用官方提供的index.js和package.json代码部署时,出现以下错误:

Deployment failed                                                                                   
ERROR: (gcloud.run.deploy) Revision 'cloudruntest-00001-fdl' 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 within the allocated timeout. This can happen when the container port is misconfigured or if the timeout is too short. The health check timeout can be extended. Logs for this revision might contain more information.

用到的代码文件

index.js内容:

// Retrieve Job-defined env vars
const { CLOUD_RUN_TASK_INDEX = 0, CLOUD_RUN_TASK_ATTEMPT = 0 } = process.env;
// Retrieve User-defined env vars
const { SLEEP_MS, FAIL_RATE } = process.env;

// Define main script
const main = async () => {
    console.log(
        `Starting Task #${CLOUD_RUN_TASK_INDEX}, Attempt #${CLOUD_RUN_TASK_ATTEMPT}...`
    );
    // Simulate work
    if (SLEEP_MS) {
        await sleep(SLEEP_MS);
    }
    // Simulate errors
    if (FAIL_RATE) {
        try {
            randomFailure(FAIL_RATE);
        } catch (err) {
            err.message = `Task #${CLOUD_RUN_TASK_INDEX}, Attempt #${CLOUD_RUN_TASK_ATTEMPT} failed.\n\n${err.message}`;
            throw err;
        }
    }
    console.log(`Completed Task #${CLOUD_RUN_TASK_INDEX}.`);
};

// Wait for a specific amount of time
const sleep = ms => {
    return new Promise(resolve => setTimeout(resolve, ms));
};

// Throw an error based on fail rate
const randomFailure = rate => {
    rate = parseFloat(rate);
    if (!rate || rate < 0 || rate > 1) {
        console.warn(
            `Invalid FAIL_RATE env var value: ${rate}. Must be a float between 0 and 1 inclusive.`
        );
        return;
    }

    const randomFailure = Math.random();
    if (randomFailure < rate) {
        throw new Error('Task failed.');
    }
};

// Start script
main().catch(err => {
    console.error(err);
    process.exit(1); // Retry Job Task by exiting the process
});

package.json内容:

{
    "name": "jobs",
    "version": "1.0.0",
    "description": "Node.js sample for Cloud Run jobs",
    "main": "index.js",
    "scripts": {
        "start": "node index.js"
    },
    "engines": {
        "node": ">=16.0.0"
    },
    "author": "Google LLC",
    "license": "Apache-2.0"
}

解决方案

错误的核心原因是你使用了gcloud run deploy命令——这是部署Cloud Run服务的命令,服务强制要求容器监听指定端口;而你需要的是Cloud Run Jobs,这是Google专门为一次性/周期性无服务任务设计的功能。

具体操作步骤

  1. 编写Dockerfile
    在项目根目录创建Dockerfile,内容如下:
FROM node:16-slim
WORKDIR /app
COPY package*.json ./
RUN npm install --only=production
COPY index.js .
CMD ["npm", "start"]
  1. 构建容器镜像
    替换命令中的[你的项目ID]为GCP项目ID,执行构建:
gcloud builds submit --tag gcr.io/[你的项目ID]/cloud-run-job-demo
  1. 创建Cloud Run Job
    执行以下命令创建Job:
gcloud run jobs create cloud-run-job-demo --image gcr.io/[你的项目ID]/cloud-run-job-demo
  1. 执行一次性任务
    立即运行该Job:
gcloud run jobs execute cloud-run-job-demo

额外配置(可选)

  • 可以在创建Job时直接设置环境变量:
gcloud run jobs create cloud-run-job-demo --image gcr.io/[你的项目ID]/cloud-run-job-demo --set-env-vars SLEEP_MS=5000,FAIL_RATE=0.2
  • Cloud Run Jobs会自动根据进程退出码处理重试(退出码非0时触发重试),无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:50:07