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

Docker容器中Puppeteer启动Chromium失败的解决求助

解决NestJS Docker容器中Puppeteer无法运行的问题

问题根源

你的Dockerfile存在核心错误:Alpine Linux使用apk包管理器,却添加了Debian系的deb软件源,两者完全不兼容,直接导致Chrome安装失败。另外,Alpine环境下运行Chromium还需要额外的系统依赖库,当前安装命令也缺失了这些必要内容。

修正后的Dockerfile

FROM node:18-alpine AS base

# 跳过Puppeteer自带的Chromium下载
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
# 指定系统中Chromium的路径
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser

# 安装Chromium和必要的系统依赖
RUN apk update && apk add --no-cache \
    chromium \
    nss \
    freetype \
    harfbuzz \
    ca-certificates \
    ttf-freefont \
    && rm -rf /var/cache/apk/*

# 创建非root用户并切换
USER node
WORKDIR /app

# 复制依赖文件并安装
COPY --chown=node:node package*.json ./
RUN npm ci

# 复制项目源码
COPY --chown=node:node . .

NestJS中Puppeteer的配置

在NestJS服务中,启动Puppeteer时必须添加无沙箱相关参数,因为Docker容器默认没有足够权限运行沙箱模式:

import { Injectable } from '@nestjs/common';
import puppeteer from 'puppeteer';

@Injectable()
export class PdfService {
  async generatePdf(htmlContent: string): Promise<Buffer> {
    const browser = await puppeteer.launch({
      executablePath: process.env.PUPPETEER_EXECUTABLE_PATH,
      args: [
        '--no-sandbox',
        '--disable-setuid-sandbox',
        '--disable-dev-shm-usage', // 解决Alpine内存不足问题
        '--disable-gpu', // 无GPU环境下禁用
      ],
      headless: 'new', // 使用新版无头模式,稳定性更好
    });

    const page = await browser.newPage();
    await page.setContent(htmlContent, { waitUntil: 'networkidle0' });
    const pdfBuffer = await page.pdf({ format: 'A4' });

    await browser.close();
    return pdfBuffer;
  }
}

额外注意事项

  • Alpine官方源没有Google Chrome包,直接用Chromium即可,功能上和Chrome几乎一致,完全满足Puppeteer的PDF转换需求。
  • 确保package.json中puppeteer版本与安装的Chromium版本兼容,若出现版本不匹配问题,可指定对应版本的Puppeteer进行安装。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:42:22