第二代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
相关产品推荐
相关产品推荐

