Firefox headless 不能在 Docker 中以非 root 用户身份工作

Posted

技术标签:

【中文标题】Firefox headless 不能在 Docker 中以非 root 用户身份工作【英文标题】:Firefox headless not working within Docker as non-root user 【发布时间】:2021-05-15 06:13:58 【问题描述】:

正如标题所说,我在 Docker 容器中以非 root 用户身份在无头模式下运行 Firefox 时遇到问题。考虑以下 Dockerfile,使用 docker build -t firefox .

构建
FROM python:3.8-buster
RUN apt-get update -qq \
    && apt-get install -qy \
        libappindicator1 \
        libasound2 \
        libatk1.0-0 \
        libc6 \
        libcairo2 \
        libcups2 \
        libdbus-1-3 \
        libexpat1 \
        libfontconfig1 \
        libgbm-dev \
        libgcc1 \
        libgconf-2-4 \
        libgdk-pixbuf2.0-0 \
        libglib2.0-0 \
        libgtk-3-0 \
        libnspr4 \
        libnss3 \
        libpango-1.0-0 \
        libpangocairo-1.0-0 \
        libpci-dev \
        libstdc++6 \
        libx11-6 \
        libx11-xcb1 \
        libxcb1 \
        libxcomposite1 \
        libxcursor1 \
        libxdamage1 \
        libxext6 \
        libxfixes3 \
        libxi6 \
        libxrandr2 \
        libxrender1 \
        libxss1 \
        libxtst6 \
        xdg-utils \
        nano

RUN wget https://download-installer.cdn.mozilla.net/pub/firefox/releases/85.0.2/linux-x86_64/en-US/firefox-85.0.2.tar.bz2 -O /firefox.tar.bz2
RUN tar -xf /firefox.tar.bz2 --directory /
WORKDIR /firefox
RUN ./firefox -CreateProfile "headless /profile-headless" -headless
RUN chmod -Rf 777 /firefox && chmod -Rf 777 /profile-headless
cmd ["./firefox", "-profile", "/profile-headless", "-headless", "--screenshot", "https://example.org"]

如果我以 root 身份运行容器,一切都很好,并且过程完成(出现了一些警告,但总体上可以):

$ docker run --rm firefox
*** You are running in headless mode.
[GFX1-]: glxtest: Unable to open a connection to the X server
[GFX1-]: glxtest: libEGL missing
$

但是,如果我以其他用户身份运行它,则会出现相同的输出,但进程会挂起。

$ docker run --rm --user=1001 firefox
*** You are running in headless mode.
[GFX1-]: glxtest: Unable to open a connection to the X server
[GFX1-]: glxtest: libEGL missing

我尝试为保存二进制文件的目录 (/firefox) 和配置文件一 (profile-headless) 分配 777 权限,但这似乎不起作用。 可能一些依赖项不是必需的,我只是不想在遇到更大的问题时花时间。

作为说明,我最初在尝试以非 root 身份在 Docker 中运行 playwright-python 时遇到了这个问题。 Chromium 浏览器运行良好,但 Firefox 无法初始化,playwright 最终抛出超时错误。我深入挖掘并意识到独立的 Firefox 对我来说也失败了。

我想我一定是缺少一些配置、环境变量等。任何帮助将不胜感激,在此先感谢!

【问题讨论】:

你修好了吗? 【参考方案1】:

Playwright 确实使用自己的 Firefox 和 WebKit 版本。为此,需要特定的 Playwright 版本,因此无法在其中使用您尝试通过 apt 安装的普通 Firefox 或 Safari。

在您的场景中,您可能正在寻找自动安装依赖项的命令,可以通过执行npx playwright install-deps 来完成,请参阅here 以供参考。

此外,建议使用official Docker image,它针对每个版本进行了测试,并确保它包含运行 Playwright 及其所有功能所需的所有依赖项。

【讨论】:

剧作家部分纯属轶事,它甚至没有出现在 Dockerfile 中。问题是关于在 docker 中以非 root 用户身份运行 Firefox。 您可以利用官方 Docker 镜像,该镜像已经有一个非 root 用户可用“pwuser”。见这里:playwright.dev/docs/docker#crawling-and-scraping。你在用剧作家吗?如果不是,我建议删除标签,因为我的评论也无关紧要。错误Unable to open a connection to the X server 来自于您以正常的headed 模式启动firefox。使用 xvfb-run 或无头模式来解决此问题。

以上是关于Firefox headless 不能在 Docker 中以非 root 用户身份工作的主要内容,如果未能解决你的问题,请参考以下文章

Selenium+Headless Firefox

linux机器上的headless firefox浏览器是不是需要设置DISPLAY

Mac 状态栏项目但不在 Dock 上

是否可以在没有 Dock 图标的情况下将程序作为 AppleScript 程序的子进程运行?

seleniumHeadless Chrome/Firefox--PhantomJS停止支持后,使用无界面模式。

Libreoffice --headless 拒绝转换,除非是 root,不能在 PHP 脚本中工作