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

NestJS+Puppeteer部署Cloud Run遇浏览器启动超时问题求助

解决NestJS+Puppeteer部署Cloud Run时浏览器启动超时问题

问题背景

部署NestJS+Puppeteer爬虫服务到Cloud Run时,Docker容器正常启动,但调用puppeteer.launch启动浏览器时出现30秒超时错误,错误日志如下:

error: TimeoutError: Timed out after 30000 ms while waiting for the WS endpoint URL to appear in stdout!
at ChromeLauncher.launch (/app/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ProductLauncher.js:145:23)
at async PuppeteerExtra.launch (/app/node_modules/puppeteer-extra/dist/index.cjs.js:128:25)

本地M1 Mac运行容器时出现qemu架构兼容错误,此为M1模拟x86的固有问题,无需重点处理。

修复方案

1. 优化Dockerfile配置

Alpine镜像下的Chromium需要完整依赖支持,调整后的Dockerfile如下:

FROM --platform=linux/amd64 node:lts-alpine

ENV PORT 3000
ENV HOST 0.0.0.0
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser

USER root

WORKDIR /app

# 替换Alpine镜像源加速安装(可选)
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

# 安装Chromium及完整依赖
RUN apk update && apk add --no-cache \
    chromium \
    nss \
    freetype \
    harfbuzz \
    ca-certificates \
    ttf-freefont \
    dbus \
    udev

# 创建专用运行用户并配置权限
RUN addgroup -S pptruser && adduser -S -G pptruser pptruser \
    && mkdir -p /home/pptruser/Downloads \
    && chown -R pptruser:pptruser /home/pptruser \
    && chown -R pptruser:pptruser /app

COPY . .

# 生产环境安装依赖
RUN npm ci --only=production
RUN npx prisma generate
RUN npm run build

USER pptruser

ENV NODE_ENV=production

CMD ["npm", "run", "start:prod"]
  • 新增环境变量跳过Puppeteer自动下载浏览器,直接使用系统安装的Chromium
  • 补充dbus和udev依赖,修复Chromium启动时的总线连接问题
  • 使用npm ci替代npm install,确保依赖版本一致
  • 简化权限配置流程,避免不必要的权限问题

2. 调整Puppeteer启动参数

适配Cloud Run无服务器环境,修改启动代码:

this.#browser = await puppeteer.launch({
  headless: 'new',
  executablePath: process.env.PUPPETEER_EXECUTABLE_PATH,
  args: [
    '--no-sandbox',
    '--disable-setuid-sandbox',
    '--disable-dev-shm-usage', // 解决容器共享内存不足问题
    '--disable-accelerated-2d-canvas',
    '--no-first-run',
    '--no-zygote',
    '--single-process', // 单进程模式减少资源占用
    '--disable-gpu',
    '--disable-features=VizDisplayCompositor'
  ],
  timeout: 60000, // 延长超时时间至60秒
});
  • --disable-dev-shm-usage:Cloud Run的/dev/shm空间有限,改用内存文件系统
  • --single-process+--no-zygote:降低进程开销,适配无服务器环境资源限制
  • 延长超时时间,给Chromium足够的启动时间

3. Cloud Run服务配置调整

  • 资源分配:至少配置1vCPU和2GB内存,确保Chromium有足够资源启动
  • 启动超时:将服务启动超时设置为5分钟,避免容器初始化时间过长被终止

本地M1测试建议

若需本地测试,可将Dockerfile开头的--platform=linux/amd64改为--platform=linux/arm64,使用arm架构镜像规避qemu兼容问题;或直接在Cloud Run上验证部署结果,无需纠结本地M1运行问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:19:58