首页 > 解决方案 > 如何在 Docker 中使用 Chromium v​​77 运行 NodeJS puppeteer?

问题描述

Alpine 于 10 月 8 日支持 Chromium v​​77。

参考:https ://pkgs.alpinelinux.org/packages?name=chromium&branch=edge

尝试复制下载 Chromium v​​77 并运行 Puppeteer v1.20 的步骤,但运行时出错:

Error for printPdf()
{}
Error: Failed to launch chrome!
Error relocating /usr/lib/chromium/chrome: _ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEC1Ev: symbol not found
Error relocating /usr/lib/chromium/chrome: _ZNSt7__cxx1119basic_ostringstreamIcSt11char_traitsIcESaIcEEC1Ev: symbol not found
Error relocating /usr/lib/chromium/chrome: hb_subset_input_set_retain_gids: symbol not found
Error relocating /usr/lib/chromium/chrome: _ZNSt19_Sp_make_shared_tag5_S_eqERKSt9type_info: symbol not found


TROUBLESHOOTING: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md

    at onClose (/usr/src/app/node_modules/puppeteer/lib/Launcher.js:348:14)
    at Interface.<anonymous> (/usr/src/app/node_modules/puppeteer/lib/Launcher.js:337:50)
    at Interface.emit (events.js:214:15)
    at Interface.close (readline.js:403:8)
    at Socket.onend (readline.js:180:10)
    at Socket.emit (events.js:214:15)
    at endReadableNT (_stream_readable.js:1178:12)
    at processTicksAndRejections (internal/process/task_queues.js:77:11)

Dockerfile:

FROM node:12-alpine

ENV CHROME_BIN="/usr/bin/chromium-browser"\
    PUPPETEER_SKIP_CHROMIUM_DOWNLOAD="true"

RUN set -x \
    && apk update \
    && apk upgrade \
    && echo "127.0.0.1 localhost" >> /etc/hosts \
    && echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" > /etc/apk/repositories \
    && echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories \
    && echo "http://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories \
    && apk add --no-cache g++ chromium \
    && npm install puppeteer@1.20.0 puppeteer-core@1.20.0 
    ...

标签: node.jsdockerchromiumpuppeteeralpine

解决方案


我认为问题在于您的安装。您可以尝试将此作为基本映像。

FROM zenika/alpine-chrome:77-with-node
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
RUN npm install puppeteer@1.20.0 puppeteer-core@1.20.0 
COPY my_script.js /usr/src/app/
CMD ["node","my_script.js"]

my_script.js 测试代码

const puppeteer = require('puppeteer');

(async () => {
  const browser =await puppeteer.launch({
  executablePath: '/usr/bin/chromium-browser',
  args: ['--no-sandbox', '--headless', '--disable-gpu']
});
  const page = await browser.newPage();
  await page.goto('https://news.ycombinator.com', {waitUntil: 'networkidle2'});
  await page.pdf({path: 'hn.pdf', format: 'A4'});

  await browser.close();
})();

如果你想从 sractch 构建,那么你可以使用这个Dockerfile并根据你的需要进行修改。


推荐阅读