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

