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

