快穿无cp无攻略:运行无头铬 /木偶与-无沙箱(sandbox run)

Background

我在我的 localhost 上构建了一个使用 Puppeteer 的应用程序。现在,我正在尝试将其部署到 debian 环境中,运行 Puppeteer 的脚本正在超时。在研究它之后,我意识到这是一个常见的问题。大多数 debian 环境都缺少运行 Chromium 所需的依赖关系。

Problem I found some recommended ways to run the application using Docker here.

我可以使用 Docker 运行应用程序,但是一旦我将 Chrome 特定数据添加到我的 Docker 文件中,就会出现一些错误。

无法移动到新的命名空间:支持 PID 命名空间,支持网络命名空间,但失败:errno = 不允许操作

建议以 Docker 文件中的用户身份运行应用程序。但是,当我添加该用户时,用户会收到上面提到的错误。

然后当我尝试以 root 身份运行应用程序时,我收到一个新错误,

不支持在没有--no-sandbox 的情况下以 root 身份运行。

尽管不建议使用,但我希望即使使用--no-sandbox也能使应用程序运行,以查看它是否有效。

Example

我一直在运行这样的应用程序,

docker run -p 3000:3000 user/app-name
Docker File
FROM ubuntu:16.04
# Application parameters and variables
ENV NODE_ENV=production
ENV PORT=3000
ENV Root_Dir /
ENV application_directory /usr/src/app
ENV font_directory /usr/share/fonts/noto
# Configuration for Chrome
ENV CONNECTION_TIMEOUT=60000
ENV CHROME_PATH=/usr/bin/google-chrome
RUN mkdir -p $application_directory
RUN mkdir -p $font_directory
# Dependencies needed for packages downstream
RUN apt-get update && apt-get install -y \
  apt-utils \
  unzip \
  fontconfig \
  locales \
  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
# It's a good idea to use dumb-init to help prevent zombie chrome processes.
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
# Install Node.js
RUN apt-get install --yes curl &&\
  curl --silent --location https://deb.nodesource.com/setup_8.x | bash - &&\
  apt-get install --yes nodejs &&\
  apt-get install --yes build-essential
# Install emoji's
RUN cd $font_directory &&\
  wget https://github.com/emojione/emojione-ets/releases/download/3.1.2/emojione-android.ttf &&\
  wget https://github.com/googlei18n/noto-cjk/blob/master/NotoSansCJKsc-Medium.otf?raw=true && \
  fc-cache -f -v
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
# Cleanup
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Install puppeteer so it's available in the container.
RUN npm i puppeteer
# Add user so we don't need --no-sandbox.
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 /node_modules
RUN cd $application_directory
WORKDIR $application_directory
# Install app dependencies
COPY package.json .
# Bundle app source
COPY . .
# Build
RUN npm install
USER pptruser
# Expose the web-socket and HTTP ports
EXPOSE 3000
ENTRYPOINT ["dumb-init", "--"]
CMD ["google-chrome-unstable", "npm", "start"]
Question

如何运行 Docker 并传递,

--no-sandbox

param 所以它会让我运行这个根?

或者,我需要在当前的 Docker 文件中更改什么,以便它可以让我将其作为USER pptruser运行

当前问题-

Runnning as

USER pptruser

无法移动到新的命名空间:支持 PID 命名空间,支持网络命名空间,但失败:errno = 不允许操作

运行为

root

不支持在没有--no-sandbox 的情况下以 root 身份运行。

27

我遇到了一个类似的问题,试图在 Alpine Docker 容器中运行 Chromium 无头,显然还有许多其他问题(例如,herehere)。--no-sandbox选项是一个简单的解决方法,但显然是一个糟糕的安全实践。

下载this file(如果有兴趣,请参阅作者的注释here)。然后在启动 Docker 时传递选项--security-opt seccomp=path/to/chrome.json,或者在docker-compose.yml中指定相同的选项。

16

在您的 nodejs 代码中,当您启动浏览器时,您可以传递--no-sandbox参数。

示例:-

const launchBrowser = async () => {
  puppetBrowser = await puppeteer.launch({
    args: ['--no-sandbox'],
    timeout: 10000,
  });
};
6

不需要超时,

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

我是 OP。几个月过去了,我继续看到人们在互联网上有类似的问题。Github 问题和 SO。由于我想向大家展示我是如何解决这个问题的。

Problem

由于缺少库,在 Debian 上运行 Puppeteer 失败。

Solution

我能够使用 Docker 文件运行应用程序,并向 Puppeteer 添加一个配置选项。

Examples Docker File
FROM node:8
ENV HOST 0.0.0.0
EXPOSE 8080
RUN apt-get update
# for https
RUN apt-get install -yyq ca-certificates
# install libraries
RUN apt-get install -yyq 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
# tools
RUN apt-get install -yyq gconf-service lsb-release wget xdg-utils
# and fonts
RUN apt-get install -yyq fonts-liberation
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN mkdir -p /usr/src/app/views
# install the necessary packages
RUN npm install
CMD npm run start
Puppeteer
const browser = await puppeteer.launch({
          args: ['--no-sandbox', '--disable-setuid-sandbox'],
          ignoreHTTPSErrors: true,
          dumpio: false
        });

基本上在运行应用程序时,您将通过配置 Docker 文件来安装缺少的库,然后当您的应用程序运行时,传递给 Puppeteer 对象的配置选项将允许您的应用程序在 Debian 上运行。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(143)
清华紫光u盘修复工具:是否有任何docx修复工具提供有意义的错误消息
上一篇
大学代码查询:MongoDB聚合查询从 MongoDB大学课程
下一篇

相关推荐

  • concord是什么牌子:穿越时空,体验Concord的非凡之美

    Concord是一个美国安全品牌,专门为家庭和企业提供安全产品。它的产品包括家用安全系统、安全监控设备、智能锁、安全门等。代码:CONCORD…

    2023-03-13 11:05:04
    0 42 45
  • cords是什么意思:如何使用Cords来提高生产力

    示例示例Cords是一种常用的设计模式,它允许你把多个函数链接在一起,以便更好地处理复杂的逻辑。代码示例:…

    2023-01-28 07:40:52
    0 51 69
  • java foreach跳出本次循环:使用break语句跳出Java Foreach循环

    Java foreach跳出本次循环可以使用continue语句。continue语句会跳过当前循环中剩余的语句,然后继续下一次循环。…

    2023-01-11 12:12:41
    0 82 82
  • what can i do for you 回答:How Can I Help You?

    这取决于您想要我做什么。我可以帮助您完成一些编程任务,如创建网站,编写脚本,编写应用程序,编写API,编写数据库,编写算法,编写机器学习模型等。我也可以帮助您解决其他技术问题,如调试代码,优化性能,解决安全问题等。例如,我可以为您编写以下代码,以实现某些功能:…

    2023-01-26 13:54:16
    0 44 29
  • mifare classic tool怎么用:使用Mifare Classic Tool来管理你的Mifare Classic卡

    Mifare Classic Tool是一款开源的Android应用程序,它可用于读取和写入Mifare Classic NFC标签。它的主要功能是:…

    2023-02-17 15:24:20
    0 13 94
  • cordic算法详解:实现CORDIC算法的数学原理及其应用

    CORDIC(COordinate Rotation DIgital Computer)算法是一种基于反复旋转的数字算法,可以用来计算几何函数(如正弦、余弦、正切等)和其他复杂函数,因此也被称为旋转算法。它是一种非常有效的算法,可以在很少的时间内实现几何函数的计算。CORDIC算法的基本思想是:通过反复旋转向量,以达到计算几何函数的目的。它的具体步骤如下:…

    2023-01-14 16:01:55
    0 94 97
  • struct和class区别 A Comparison of Their Characteristics and Uses

    示例示例struct和class的主要区别在于:struct是值类型,class是引用类型。…

    2023-01-27 15:29:38
    0 72 37
  • curl 超时时间设置解决网络请求延迟的最佳实践

    示例示例cURL 超时时间设置是指在 cURL 发出请求后,等待服务器响应的最长时间。如果超过了设定的超时时间,则会收到一个超时错误。可以使用 curl_setopt() 函数来设置 cURL 超时时间,该函数的第一个参数是 cURL 资源句柄,第二个参数是 CURLOPT_TIMEOUT,用于设置 cURL 超时时间。…

    2023-02-22 07:17:34
    0 69 53

发表评论

登录 后才能评论

评论列表(53条)