#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.