在Docker中以headful模式执行人偶的问题 [英] Issue in executing puppeteer in headful mode in Docker

查看:59
本文介绍了在Docker中以headful模式执行人偶的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是puppeteer和docker的新手。我在docker容器中以headful模式设置puppeteer时遇到问题。

I am new to puppeteer and docker. I am facing an issue while setting up puppeteer in headful mode in docker container.

Puppeteer version: 1.6.2 Platform / OS version: Docker node:8-slim Node.js version: node 8

DockerFile-

DockerFile -

FROM node:8-slim
RUN apt-get update && apt-get install --no-install-recommends -y ca-certificates curl fontconfig fonts-liberation gconf-service git libappindicator1 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 libnss3 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 locales lsb-release unzip wget xdg-utils

RUN apt-get update && apt-get install -y wget --no-install-recommends && wget -q -O - https://dl-ssl.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.list' && apt-get update && apt-get install -y google-chrome-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst ttf-freefont --no-install-recommends && rm -rf /var/lib/apt/lists/* \
    && apt-get purge --auto-remove -y curl && rm -rf /src/*.deb

ADD https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64 /usr/local/bin/dumb-init

RUN chmod +x /usr/local/bin/dumb-init

RUN groupadd -r pptruser && useradd -r -g pptruser -G audio,video pptruser && mkdir -p /home/pptruser/Downloads && chown -R pptruser:pptruser /home/pptruser && chown -R pptruser:pptruser .

USER pptruser
EXPOSE 4081/tcp
CMD [ "npm", "start" ]

应用代码:

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

我正在使用puppeteer截取所提供网址的屏幕截图。它在无头真实模式下成功执行。但是,当相同的脚本以无头假执行时,它会给出如下错误:

I am using puppeteer to take screenshot of the url provided. It executes successfully in headless true mode. But, when same script executed with headless false, it gives errors as:


  1. 错误:无法启动chrome!
    [0803 / 070106.562113:ERROR:nacl_helper_linux.cc(310)] NaCl帮助程序进程在没有沙箱的情况下运行!

  1. Error: Failed to launch chrome! [0803/070106.562113:ERROR:nacl_helper_linux.cc(310)] NaCl helper process running without a sandbox!

[11104:11104:0816 /105455.434188:FATAL:zygote_host_impl_linux.cc(123)]没有可用的沙箱!更新您的内核或查看 https://chromium.googlesource.com /chromium/src/+/master/docs/linux_suid_sandbox_development.md 了解有关使用SUID沙箱进行开发的更多信息。如果您想过着危险的生活,需要立即解决,可以尝试使用--no-sandbox

[11104:11104:0816/105455.434188:FATAL:zygote_host_impl_linux.cc(123)] No usable sandbox! Update your kernel or see https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox_development.md for more information on developing with the SUID sandbox. If you want to live dangerously and need an immediate workaround, you can try using --no-sandbox

请帮助解决此问题。或者您可以共享一个示例应用程序代码,该代码使用puppeteer在headful模式下在Docker容器中截图。
使用Headful模式的原因:更好的性能和某些网站不允许的

Could you please help with this issue. Or could you share a sample application code which uses puppeteer for screenshot in docker container in headful mode. Reason for using headful mode: better performance and some sites don't allow

推荐答案

检查以下 Dockerfile ,阅读注释。它应该可以正常运行。

Check the following Dockerfile, read the comments. It should run properly.

# First, we need to make sure all dependencies are there. If you are using docker, then the important dependencies are already present on most node images. 
FROM node:8

# To run Headful mode, you will need to have a display, which is not present in a server. 
# To avoid this, we will use Xvfb, and create a fake display, so the chrome will think there is a display and run properly. 
# So we just need to install Xvfb and Puppeteer related dependencies.
RUN 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 x11vnc x11-xkb-utils xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic x11-apps xvfb

# I am going to ignore dumb-init or such for now since it will add complexities to understand what is actually needed here. 

# Assuming we are working on /app folder, cd into /app
WORKDIR /app

# Copy package.json into app folder
COPY package.json /app

# Install dependencies
RUN npm install 

COPY . /app

# Start server on port 3000
EXPOSE 3000

# I'll also assume you are going to use root user, 
# and your script has `--no-sandbox` and `--disable-setuid-sandbox` arguments.
# We run a fake display and run our script.
# Start script on Xvfb
CMD xvfb-run --server-args="-screen 0 1024x768x24" npm start

然后我用以下命令运行它,

Then I run it with following command,

# build the app
sudo docker build -t app . 

# start the container, expose to network and remove after running
sudo docker run --network=host -it app

我上面使用的脚本示例结果,可以是任何脚本,

Sample result from our script that I used above, it can be any script,

Step 8/8 : CMD xvfb-run --server-args="-screen 0 1024x768x24" npm start
 ---> Using cache
 ---> b1319f0e68ef
Successfully built b1319f0e68ef
Successfully tagged scraper:latest

> puppeteer-with-xvfb@1.1.0 start /app
> node index.js

Example app listening on port 3000!
> Opening browser
> Navigating url
> Typing text
> Wait for results
> Extracted data
> Cleaning up instances

这篇关于在Docker中以headful模式执行人偶的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆