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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:07:14