Docker容器中使用Puppeteer启动Headless Chrome失败求助
问题描述
Docker容器可正常启动,但调用localhost:3000/screenshot接口时超时,Headless Chrome无法启动,报错如下:
TimeoutError: waiting for target failed: timeout 300000ms exceeded at waitWithTimeout (/opt/app/node_modules/puppeteer-core/lib/cjs/puppeteer/common/util.js:292:26) at CDPBrowser.waitForTarget (/opt/app/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Browser.js:339:56) at ChromeLauncher.waitForPageTarget (/opt/app/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ProductLauncher.js:204:27) at ChromeLauncher.launch (/opt/app/node_modules/puppeteer-core/lib/cjs/puppeteer/node/ProductLauncher.js:156:24) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async /opt/app/server.js:8:21
相关配置文件如下:
server.js
const express = require('express'); const puppeteer = require('puppeteer'); const app = express(); app.get('/screenshot', async (req, res) => { console.log('Taking screenshot'); const browser = await puppeteer.launch({ headless: true, // executablePath: '/opt/homebrew/bin/chromium', // executablePath: 'google-chrome-stable', // executablePath: '/usr/bin/chromium-browser', executablePath: '/opt/google/chrome/google-chrome', args: ['--no-sandbox', '--headless' ], timeout: 300000, }); console.log('started browser'); const page = await browser.newPage(); console.log('opened new page'); await page.goto('https://www.google.com'); console.log('went to google'); const imageBuffer = await page.screenshot(); console.log('took screenshot'); await browser.close(); console.log('closed browser'); res.set('Content-Type', 'image/png'); res.send(imageBuffer); console.log('Screenshot taken'); }); app.listen(3000, () => { console.log('Listening on port 3000'); });
Dockerfile
FROM node:slim # We don't need the standalone Chromium ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true ENV chrome_launchOptions_args --no-sandbox,--disable-dev-shm-usage # Install Google Chrome Stable and fonts # Note: this installs the necessary libs to make the browser work with Puppeteer. RUN apt-get update && apt-get install gnupg wget -y && \ wget --quiet --output-document=- https://dl-ssl.google.com/linux/linux_signing_key.pub | gpg --dearmor > /etc/apt/trusted.gpg.d/google-archive.gpg && \ sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' && \ apt-get update && \ apt-get install google-chrome-stable -y --no-install-recommends && \ rm -rf /var/lib/apt/lists/* # Create working directory WORKDIR /opt/app # Copy package.json COPY package.json ./ # Install NPM dependencies for function RUN npm install # Copy handler function and tsconfig COPY server.js ./ # Expose app EXPOSE 3000 # Run app CMD ["node", "server.js"]
package.json
{ "name": "headless-chrome-nodejs-server", "version": "1.0.0", "description": "Headless Chrome Node.js server in Docker", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.18.2", "puppeteer": "^20.1.2" } }
解决方案
1. 修正Puppeteer启动参数
Docker环境下运行Headless Chrome需补充关键参数,解决资源不足和兼容性问题:
修改server.js中的puppeteer.launch配置:
const browser = await puppeteer.launch({ headless: "new", // 使用新版无头模式,避免旧版兼容性问题 executablePath: '/usr/bin/google-chrome-stable', // 修正Chrome路径,Docker中stable版本默认路径 args: [ '--no-sandbox', '--disable-dev-shm-usage', // 解决Docker中/dev/shm空间不足问题 '--disable-gpu', '--window-size=1920,1080', '--single-process' // 单进程模式减少资源占用 ], timeout: 300000, });
2. 完善Docker容器依赖
node:slim镜像缺少Chrome运行必需的系统库,补充安装:
修改Dockerfile中的安装步骤:
RUN apt-get update && apt-get install gnupg wget -y && \ wget --quiet --output-document=- https://dl-ssl.google.com/linux/linux_signing_key.pub | gpg --dearmor > /etc/apt/trusted.gpg.d/google-archive.gpg && \ sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' && \ apt-get update && \ apt-get install google-chrome-stable -y --no-install-recommends && \ # 补充Chrome运行必需的依赖库 apt-get install -y --no-install-recommends libx11-xcb1 libxcomposite1 libxcursor1 libxdamage1 libxi6 libxtst6 libnss3 libcups2 libxss1 libxrandr2 libasound2 libatk1.0-0 libatk-bridge2.0-0 libpangocairo-1.0-0 libpango-1.0-0 libcairo2 libgbm1 libdrm2 libatspi2.0-0 libxkbcommon0 libgtk-3-0 && \ rm -rf /var/lib/apt/lists/*
3. 确保Puppeteer与Chrome版本匹配
Puppeteer 20.1.2对应Chrome 114.x版本,若google-chrome-stable安装的是更高版本会存在兼容性问题,可选择以下两种方案:
方案A:降级Puppeteer到匹配版本
修改package.json中的依赖:
"dependencies": { "express": "^4.18.2", "puppeteer": "^19.11.1" // 此版本兼容Chrome 112-114版本 }
方案B:安装指定版本的Chrome
在Dockerfile中替换Chrome安装命令为指定版本(例如114.0.5735.198):
apt-get install google-chrome-stable=114.0.5735.198-1 -y --no-install-recommends
4. 调整容器资源限制
若Docker容器内存分配过少,Chrome启动会失败,启动容器时增加内存限制:
docker run -d -p 3000:3000 --memory=2g your-image-name
内容的提问来源于stack exchange,提问作者Lukas Mä hner
相关产品推荐
相关产品推荐

