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

Pyppeteer结合FastAPI在Docker容器中调用newPage函数卡顿

问题:Pyppeteer + FastAPI 部署Docker后卡在newPage函数

本地环境运行正常,但部署到Docker容器后,程序卡在newPage()函数处。相关代码及配置如下:

main.py

import uvicorn
from fastapi import FastAPI
from pyppeteer import launch

app = FastAPI()

async def test():
  browser = await launch(
    args=[
      "--no-sandbox",
      "--disable-gpu",
      "--disable-dev-shm-usage",
      "--disable-setuid-sandbox",
    ]
  )
  page = await browser.newPage()  # 此处卡住
  await page.goto("https://example.com")
  await page.waitForSelector(".invoice-box")
  bodyHandle = await page.querySelector("body")
  body = await bodyHandle.boundingBox()
  pageWidth = round(body["width"])
  pageHeight = round(body["height"])
  await page.setViewport({"width": pageWidth, "height": pageHeight})
  await page.screenshot({"path": "example.png", "fullPage": True})
  await browser.close()

@app.get("/test")
async def main():
  await test()
  return {"message": "ok"}

基础镜像

选用包含Python3.11和Nodejs18的slim镜像

Dockerfile

FROM nikolaik/python-nodejs:python3.11-nodejs18-slim

WORKDIR /code

COPY entrypoint.sh requirements.txt /code/

RUN apt-get update \
    && apt-get install -y libpango-1.0-0 libpangoft2-1.0-0 \
    && pip install --no-cache-dir --upgrade -r requirements.txt \
    && apt-get update \
    && apt-get install -yq gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 \
        libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 \
        libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 \
        libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 \
        ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget \
        xvfb x11vnc x11-xkb-utils xfonts-100dpi xfonts-75dpi xfonts-scalable x11-apps \
    && chmod +x entrypoint-dev.sh

COPY app /code/app

ENTRYPOINT ["./entrypoint.sh"]

entrypoint.sh

#!/bin/bash

uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

解决方案

1. 修正Dockerfile脚本权限错误

Dockerfile中执行chmod +x entrypoint-dev.sh,但ENTRYPOINT调用的是entrypoint.sh,两者名称不匹配,导致启动脚本无执行权限。将chmod +x entrypoint-dev.sh改为chmod +x entrypoint.sh。

2. 补充Pyppeteer启动参数

在launch的args中添加适配容器环境的参数,解决无头浏览器渲染和进程冲突问题:

browser = await launch(
    args=[
        "--no-sandbox",
        "--disable-gpu",
        "--disable-dev-shm-usage",
        "--disable-setuid-sandbox",
        "--headless=new",  # 新版无头模式,兼容性更强
        "--disable-software-rasterizer",
        "--single-process",  # 强制单进程运行,避免容器内多进程干扰
    ]
)

3. 移除Uvicorn的重载模式

容器中使用--reload会引发进程重启,干扰Pyppeteer的浏览器实例创建。修改entrypoint.sh的启动命令:

uvicorn app.main:app --host 0.0.0.0 --port 8000

4. 补充缺失的系统依赖

在Dockerfile的apt-get安装命令中添加libxshmfence1,避免渲染相关的依赖缺失:

&& apt-get install -yq gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 \
    libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 \
    libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 \
    libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 \
    ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget \
    xvfb x11vnc x11-xkb-utils xfonts-100dpi xfonts-75dpi xfonts-scalable x11-apps libxshmfence1 \

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:19:52