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

