gpt4 book ai didi

docker - 使用 --no-sandbox 运行 headless Chrome/Puppeteer

转载 作者:行者123 更新时间:2023-12-02 07:09:57 25 4
gpt4 key购买 nike

背景

我在本地主机上构建了一个使用 Puppeteer 的应用程序。现在,我尝试将其部署到 debian 环境中,运行 Puppeteer 的脚本超时。经过研究,我意识到这是一个常见问题。大多数 Debian 环境缺少运行 Chromium 所需的依赖项。

问题

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

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

Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted

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

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

Running as root without --no-sandbox is not supported.

虽然不建议这样做,但我想让应用程序即使使用 --no-sandbox 也能运行,看看它是否有效。

示例

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

docker run -p 3000:3000 user/app-name

Docker 文件

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-assets/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"]

问题

如何运行 Docker 并传递 ,

--no-sandbox

param 所以它会让我在 root 中运行它?

或者,我需要在当前的 Docker 文件中更改哪些内容,以便它可以让我以 USER pptruser 身份运行它

当前问题 -

运行为

USER pptruser

Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted

运行为

root

Running as root without --no-sandbox is not supported.

最佳答案

我在尝试在 Alpine Docker 容器中 headless 运行 Chromium 时遇到了类似的问题,显然还有许多其他问题(例如 herehere )。 --no-sandbox 选项是一种简单的解决方法,但显然是一种很差的安全实践。对我有用的是设置自定义 seccomp .

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

关于docker - 使用 --no-sandbox 运行 headless Chrome/Puppeteer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50662388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com