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

第二代Cloud Functions中Puppeteer合成监控Chromium缺失问题求助

解决方案:第二代Cloud Function(Cloud Run)中Puppeteer Chromium缺失问题

针对你在部署认证页面心跳合成监控时遇到的Chromium缺失问题,以下是经过验证的修复方案:

1. 修正Dockerfile(核心修复)

Debian/Ubuntu slim镜像中Chromium的官方包名为chromium-browser而非chromium,同时需配置环境变量避免Puppeteer重复下载Chromium:

# 使用Node.js 20 slim基础镜像
FROM node:20-slim

WORKDIR /app

# 安装系统依赖与Chromium
RUN apt-get update && apt-get install -y --no-install-recommends \
    chromium-browser \
    ca-certificates \
    fonts-liberation \
    libasound2 \
    libatk-bridge2.0-0 \
    libatk1.0-0 \
    libc6 \
    libcairo2 \
    libcups2 \
    libdbus-1-3 \
    libexpat1 \
    libfontconfig1 \
    libgbm1 \
    libgcc1 \
    libglib2.0-0 \
    libgtk-3-0 \
    libnspr4 \
    libnss3 \
    libpango-1.0-0 \
    libpangocairo-1.0-0 \
    libstdc++6 \
    libx11-6 \
    libx11-xcb1 \
    libxcb1 \
    libxcomposite1 \
    libxcursor1 \
    libxdamage1 \
    libxext6 \
    libxfixes3 \
    libxi6 \
    libxrandr2 \
    libxrender1 \
    libxss1 \
    libxtst6 \
    procps \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# 配置Puppeteer环境变量,跳过自带Chromium下载并指定系统路径
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser

# 复制依赖文件并安装
COPY package*.json ./
RUN npm install

# 复制源码
COPY . .

# 使用Cloud Functions框架启动服务
CMD ["functions-framework", "--target", "CustomPuppeteerSynthetic"]

2. 调整Puppeteer启动代码

添加Cloud Run环境必需的启动参数,确保浏览器稳定运行:

const {
  instantiateAutoInstrumentation,
  runSyntheticHandler
} = require('@google-cloud/synthetics-sdk-api');
instantiateAutoInstrumentation();

const functions = require('@google-cloud/functions-framework');
const assert = require('node:assert');
const puppeteer = require('puppeteer');

functions.http('CustomPuppeteerSynthetic', runSyntheticHandler(async ({logger, executionId}) => {
  let browser;
  try {
    // 启动系统安装的Chromium
    browser = await puppeteer.launch({
      executablePath: process.env.PUPPETEER_EXECUTABLE_PATH,
      headless: 'new',
      args: [
        '--no-sandbox',
        '--disable-setuid-sandbox',
        '--disable-dev-shm-usage', // 解决Cloud Run共享内存限制
        '--disable-gpu',
        '--no-zygote',
        '--disable-extensions'
      ],
      timeout: 0
    });

    const page = await browser.newPage();
    // 导航到目标认证页面,使用networkidle2确保页面加载完成
    const result = await page.goto('https://your-protected-page.com', {waitUntil: 'networkidle2'});
    
    // 验证页面状态码
    await assert.equal(result.status(), 200);

    // 插入认证逻辑示例(根据你的页面调整)
    // await page.type('#username', 'alert-account');
    // await page.type('#password', 'alert-password');
    // await page.click('#login-btn');
    // await page.waitForNavigation({waitUntil: 'networkidle2'});

    const title = await page.title();
    logger.info(`页面标题:${title} | 执行ID:${executionId}`);
  } finally {
    // 确保浏览器关闭,避免资源泄漏
    if (browser) await browser.close();
  }
}));

3. 修正package.json依赖

确保依赖版本兼容,示例配置:

{
  "name": "synthetic-monitor",
  "version": "1.0.0",
  "dependencies": {
    "@google-cloud/functions-framework": "^3.3.0",
    "@google-cloud/synthetics-sdk-api": "^0.1.0",
    "puppeteer": "^21.0.0"
  }
}

4. 部署命令

部署第二代Cloud Function时指定Dockerfile构建:

gcloud functions deploy CustomPuppeteerSynthetic \
  --gen2 \
  --runtime nodejs20 \
  --region us-central1 \
  --source . \
  --entry-point CustomPuppeteerSynthetic \
  --allow-unauthenticated

关键修复说明

  • 包名修正:将chromium替换为chromium-browser,匹配Debian镜像的官方包名
  • 环境变量配置:通过PUPPETEER_SKIP_CHROMIUM_DOWNLOAD避免重复下载,PUPPETEER_EXECUTABLE_PATH自动指定系统Chromium路径
  • 启动参数优化:添加--disable-dev-shm-usage解决Cloud Run的共享内存限制,保证浏览器稳定运行

内容的提问来源于stack exchange,提问作者João Ramires

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:44:56