Развертывание приложения Dockerized node на Heroku и использование Xvfb с puppeteer, не может запустить браузер

#node.js #docker #heroku #puppeteer #xvfb

#node.js #docker #heroku #puppeteer #xvfb

Вопрос:

Версия Puppeteer: 5.5

Версия платформы / ОС: контейнер Docker, развернутый на Heroku

Node.js версия: последняя

Я настроил скрипты puppeteer, которые находятся в контейнере docker, чтобы их можно было запускать с помощью Xvfb, имитируемого пользовательского интерфейса, чтобы скрипты можно было запускать в headless:false режиме mode. Сайт, который они сканируют, делает это обязательным требованием.

Контейнер docker создается нормально, и изображение запускается локально. Я могу запускать скрипты, и запускается смоделированный дисплей Xfvb, который позволяет браузеру запускаться по назначению. Сценарии выполняются, как и ожидалось, в моем локальном образе docker.

Я развернул это на Heroku и запустил dyno, и попытался запустить скрипты на dyno. Dyno работает нормально, сервер запускается и прослушивает запросы. Когда я пытаюсь запустить скрипты узла, кажется, что браузер не может подключиться или запустить имитируемый дисплей.

Xvfb: https://www.x.org/releases/X11R7.6/doc/man/man1/Xvfb.1.xhtml

Ошибка при попытке запустить сценарии на heroku dyno

 steveszumski@Steves-MacBook-Pro crawler % heroku run node crawler.js
Running node crawler.js on ⬢ suresale-crawler... up, run.3678 (Free)
Running getReport Headless Script
Error: Failed to launch the browser process!
Fontconfig warning: "/etc/fonts/fonts.conf", line 100: unknown element "blank"
[15:15:1211/184429.509801:ERROR:browser_main_loop.cc(1439)] Unable to open X display.
[1211/184429.534086:ERROR:nacl_helper_linux.cc(307)] NaCl helper process running without a sandbox!
Most likely you need to configure your SUID sandbox correctly


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

    at onClose (/app/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:193:20)
    at ChildProcess.<anonymous> (/app/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:184:79)
    at ChildProcess.emit (node:events:388:22)
    at Process.ChildProcess._handle.onexit (node:internal/child_process:284:12)
 

Раздел crawler.js это ошибки

 try {
      const browser = await puppeteer.launch({ 
        headless: false,
        args: [
          '--no-sandbox'
        ]
       });
      
      const page = await browser.newPage();
 

Dockerfile

 FROM node:latest

# update and add all the steps for running with xvfb
RUN apt-get update amp;amp;
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 xfonts-cyrillic x11-apps 
amp;amp; apt-get install -y wget gnupg 
amp;amp; wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - 
amp;amp; sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' 
amp;amp; apt-get update 
amp;amp; apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 
  --no-install-recommends 
amp;amp; rm -rf /var/lib/apt/lists/*

RUN apt-get install bash
RUN apt-get install python
RUN apt-get install curl
RUN apt-get install openssh-client

#remove zombie images
ADD https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_x86_64 /usr/local/bin/dumb-init
RUN chmod  x /usr/local/bin/dumb-init
ENTRYPOINT ["dumb-init", "--"]


WORKDIR /app
# using /tmp in order to read/write to container fs as non-root user
# WORKDIR /tmp 
# add the required dependencies - this breaks the build process for some reason, manually npm install below works
# COPY node_modules /app/node_modules

RUN npm install puppeteer 
# Add user so we don't need --no-sandbox.
  # same layer as npm install to keep re-chowned files from using up several hundred MBs more space
  amp;amp; groupadd -r pptruser amp;amp; useradd -r -g pptruser -G audio,video pptruser 
  amp;amp; mkdir -p /home/pptruser/Downloads 
  amp;amp; chown -R pptruser:pptruser /home/pptruser 
  amp;amp; npm install express 
  amp;amp; npm install basic-ftp 
  # amp;amp; chown -R pptruser:pptruser /node_modules
    
# For Heroku exec  
RUN rm /bin/sh amp;amp; ln -s /bin/bash /bin/sh

ADD ./.profile.d /app/.profile.d

EXPOSE 3000
# Run everything after as non-privileged user.
USER pptruser
# USER root
# Finally copy the build application
COPY . .

# make sure we can run without a UI
ENV DISPLAY :99

CMD Xvfb :99 -screen 0 1024x768x16 -nolisten unix amp; node server.js
 

Комментарии:

1. Не ответ, но вы пробовали установить Xvfb на свой экземпляр Heroku? Работает ли это? Или вам нужно, чтобы оно было установлено на Docker? Похоже, у меня проблема с тем, что Xvfb не устанавливается на Heroku, поэтому я мог бы рассмотреть возможность переноса его в контейнер Docker.

2. Я не установил его на Heroku, он установлен в контейнере docker. Необходимо, чтобы контейнер мог работать автономно

3. @behindClouds вам удалось выяснить это в конце концов? У меня также возникла проблема с запуском puppeteer в docker на Heroku. Локально это работает нормально, только в heroku.