Docker环境中Browsershot提示找不到Chrome的问题求助
问题分析与解决方案
核心问题
你遇到的问题根源有两个:
- 用户缓存路径不匹配:全局安装puppeteer时,Chromium默认下载到安装用户(通常是root)的缓存目录,但运行Browsershot的是
sail用户,它的缓存路径是/home/sail/.cache/puppeteer,两者不互通。 - 版本不兼容:项目依赖的
puppeteer-core(Browsershot底层依赖)要求Chrome版本为118.0.5993.70,但你安装的puppeteer v19.11.1对应的Chromium版本更低,导致版本要求不匹配。
具体解决方案
方案一:统一puppeteer安装路径与版本
修改Dockerfile,将puppeteer安装到项目目录而非全局,并确保版本与项目依赖的puppeteer-core一致:
RUN apt-get update \ && apt-get install -y gconf-service libasound2 libappindicator3-1 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 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 libgbm-dev libatk-bridge2.0-0 \ && cd /var/www/html \ && npm install puppeteer@19.11.1 --unsafe-perm \ && chmod -R o+rx node_modules/puppeteer/.local-chromium
然后在Browsershot代码中指定Chrome可执行路径:
Browsershot::html($html) ->setChromePath('/var/www/html/node_modules/puppeteer/.local-chromium/linux-*/chrome-linux/chrome') ->save('output.pdf');
方案二:安装系统级Chrome替代puppeteer内置版本
直接在Docker中安装官方Chrome,避免版本与路径问题:
RUN apt-get update \ && apt-get install -y gconf-service libasound2 libappindicator3-1 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 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 libgbm-dev libatk-bridge2.0-0 \ # 安装官方Chrome && wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \ && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' \ && apt-get update \ && apt-get install -y google-chrome-stable
之后在Browsershot中指定系统Chrome路径:
Browsershot::html($html) ->setChromePath('/usr/bin/google-chrome') ->save('output.pdf');
方案三:修正缓存路径权限与环境变量
如果你坚持使用全局puppeteer,需要确保sail用户能访问Chromium缓存目录:
RUN apt-get update \ && apt-get install -y gconf-service libasound2 libappindicator3-1 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 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 libgbm-dev libatk-bridge2.0-0 \ && npm install --global --unsafe-perm puppeteer@19.11.1 \ # 复制缓存到sail用户目录并修改权限 && mkdir -p /home/sail/.cache/puppeteer \ && cp -r ~/.cache/puppeteer/* /home/sail/.cache/puppeteer/ \ && chown -R sail:sail /home/sail/.cache/puppeteer \ && chmod -R o+rx /home/sail/.cache/puppeteer
对你更新内容的补充说明
你手动运行node node_modules/puppeteer/install.js时,Chromium下载到了/home/user/.cache,但运行Browsershot的是sail用户,它无法访问该目录,所以错误依旧。要么将缓存目录权限开放给sail,要么直接按上面的方案调整安装方式。
内容的提问来源于stack exchange,提问作者hyphen
相关产品推荐
相关产品推荐

