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

Fly.io中Docker运行Puppeteer的依赖缺失与启动失败问题排查

问题描述

部署在Fly.io的Node.js应用,使用Puppeteer抓取多网站搜索结果,本地运行测试均正常,但部署后崩溃。核心报错为libnss3.so文件缺失,尝试过Puppeteer官方示例Dockerfile、zenika/alpine-chrome、node:slim等基础镜像,均出现找不到依赖或Chrome/Chromium可执行文件的问题,怀疑Fly.io未正确使用自定义Dockerfile。


附相关文件

1. 当前Dockerfile

FROM node:18-slim

WORKDIR /app

COPY package*.json ./
RUN npm install

RUN apt-get update && apt-get install -y \
    chromium \
    libnss3 \
    libatk1.0-0 \
    libatk-bridge2.0-0 \
    libcups2 \
    libdrm2 \
    libxkbcommon0 \
    libxcomposite1 \
    libxdamage1 \
    libxrandr2 \
    libgbm1 \
    libasound2 \
    libpangocairo-1.0-0 \
    libxshmfence1

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

2. fly.toml配置

app = "your-app-name"
primary_region = "iad"

[http_service]
  internal_port = 3000
  force_https = true
  auto_stop_machines = true
  auto_start_machines = true
  min_machines_running = 0
  processes = ["app"]

3. Puppeteer启动代码

const puppeteer = require('puppeteer');

async function scrape() {
  const browser = await puppeteer.launch({
    headless: 'new',
    executablePath: process.env.CHROMIUM_PATH || '/usr/bin/chromium',
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-dev-shm-usage',
      '--disable-gpu',
      '--no-zygote'
    ]
  });
  const page = await browser.newPage();
  // 抓取逻辑...
  await browser.close();
}

4. 完整报错日志

Error: Failed to launch the browser process!
/path/to/node_modules/puppeteer/.local-chromium/linux-XXXXXX/chrome-linux/chrome: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory

TROUBLESHOOTING: https://pptr.dev/troubleshooting

    at onClose (/app/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:293:20)
    at ChildProcess.<anonymous> (/app/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:285:24)
    at ChildProcess.emit (node:events:513:28)
    at ChildProcess._handle.onexit (node:child_process:293:12)

解决方案

1. 修正Dockerfile,确保依赖完整且路径正确

使用node:18-bookworm(Debian 12基础镜像,依赖支持更完善),明确安装所有必要系统依赖,并通过环境变量指定Puppeteer使用系统级Chromium:

FROM node:18-bookworm

WORKDIR /app

# 安装完整的系统依赖与Chromium
RUN apt-get update && apt-get install -y --no-install-recommends \
    chromium \
    libnss3 \
    libatk1.0-0 \
    libatk-bridge2.0-0 \
    libcups2 \
    libdrm2 \
    libxkbcommon0 \
    libxcomposite1 \
    libxdamage1 \
    libxrandr2 \
    libgbm1 \
    libasound2 \
    libpangocairo-1.0-0 \
    libxshmfence1 \
    libpango-1.0-0 \
    libcairo2 \
    libatspi2.0-0 \
    libx11-xcb1 \
    libxcb-dri3-0 \
    && rm -rf /var/lib/apt/lists/*

# 设置环境变量,跳过Puppeteer自带Chromium下载,指定系统安装路径
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

2. 简化Puppeteer启动配置

无需手动指定executablePath,直接读取环境变量即可:

const puppeteer = require('puppeteer');

async function scrape() {
  const browser = await puppeteer.launch({
    headless: 'new',
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-dev-shm-usage',
      '--disable-gpu',
      '--no-zygote',
      '--disable-software-rasterizer'
    ]
  });
  const page = await browser.newPage();
  // 抓取逻辑...
  await browser.close();
}

3. 验证Fly.io部署流程

  • 确保使用fly deploy命令部署,而非Fly.io自动构建器(若之前配置过构建器,需删除fly.toml中[build]相关配置)
  • 查看部署日志:执行fly logs,确认Dockerfile中的apt安装步骤完整执行,无报错
  • 部署后进入机器验证:执行fly ssh console,运行which chromium确认可执行文件路径,运行ldd /usr/bin/chromium | grep libnss3验证依赖存在

4. 重新部署测试

执行以下命令清除缓存并重新部署:

fly deploy --no-cache

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:05:37