【问题标题】:Docker/Selenium/Headless Chrome: Configure SUID sandbox correctlyDocker/Selenium/Headless Chrome:正确配置 SUID 沙箱
【发布时间】:2017-07-11 04:49:19
【问题描述】:

我想在我的 docker 容器中运行 selenium 和 headless chrome 以进行测试。

我尝试在我的 .js 文件中使用以下内容在 headless chrome(在我的 docker 容器之外)中运行 selenium。这有效:

const client = webdriverio.remote({
   desiredCapabilities: {
   browserName: 'chrome',
   chromeOptions: {
     args: ['--headless', '--disable-gpu']
   },
   binary: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
   },
 baseUrl: CONFIG.host,
 logLevel: 'verbose',
 waitForTimeout: 3000
 })

但我无法让它在我的 docker 容器中工作。在我的 docker 容器中,我使用“FROM selenium/standalone-chrome”。我的 dockerfile 似乎没有任何问题。当我尝试运行我的硒测试时会出现问题。我将 .js 文件中的 binary_path 更改为 /opt/google/chrome/google-chrome。但测试失败,甚至无法启动客户端。

所以我尝试运行 /opt/google/chrome/google-chrome 以查看 chrome 是否有效,但随后出现此错误:

[0711/005304.226472:ERROR:nacl_helper_linux.cc(311)] NaCl helper 
process running without a sandbox!
Most likely you need to configure your SUID sandbox correctly      

我对此很陌生(和堆栈溢出),所以我可能错过了一些基本的东西。

【问题讨论】:

    标签: javascript google-chrome selenium docker


    【解决方案1】:

    尽量包含--no-sandbox

    chromeOptions: {
      args: ['--headless', '--disable-gpu', '--no-sandbox']
    },
    

    正如我在docker-selenium所做的那样

    【讨论】:

    • 当我尝试使用 --no-sandbox 参数启动 Chrome 时,我在运行 CentOS 7 64 位的 VPS SSH 上遇到了同样的错误(同时排除了为什么我的抓取脚本不是在线工作):/ 不知道该怎么做。
    • @Anthony 你找到解决方案了吗?我在同一个地方
    • @JCarlos 我相信我确实找到了解决方案,但我不记得现在是什么了。对不起:(
    • 很奇怪,现在出现“无法连接到总线:无法连接到套接字 /var/run/dbus/system_bus_socket:没有这样的文件或目录”
    【解决方案2】:

    此错误消息...

    [1003/144118.702053:ERROR:nacl_helper_linux.cc(310)] NaCl helper process running without a sandbox!
    Most likely you need to configure your SUID sandbox correctly
    

    ...暗示您的系统中没有 setuid 沙箱,因此程序无法启动/生成新的浏览上下文,即 Chrome 浏览器 会话。


    解决方案

    最简单(不是那么干净)的解决方案是,如果你想运行 Chrome 并且只使用命名空间沙箱,你可以设置标志:

    --disable-setuid-sandbox
    

    此标志将禁用 setuid 沙箱(仅限 Linux)。但是,如果您在没有适当内核支持命名空间沙箱的主机上执行此操作,Chrome 将不会启动。作为替代方案,您也可以使用该标志:

    --no-sandbox
    

    此标志将为所有通常被沙盒处理的进程类型禁用沙盒。

    例子:

    chromeOptions: {
          args: ['--disable-setuid-sandbox', '--no-sandbox']
    },
    

    您可以在Security Considerations - ChromeDriver - Webdriver for Chrome找到详细讨论


    深潜

    根据Linux SUID Sandbox Development 中的文档, 需要一个 SUID 辅助二进制文件才能在 Linux 上打开沙箱。在大多数情况下,您可以使用以下命令为您安装合适的沙箱:

    build/update-linux-sandbox.sh
    

    此程序将在/usr/local/sbin 中为您安装正确的沙盒,并告诉您在需要时更新您的.bashrc

    但是,也有一些例外,例如,如果您的 setuid 二进制文件已过期,您将收到如下消息:

    NaCl helper process running without a sandbox!
    Most likely you need to configure your SUID sandbox correctly 
    

    或者

    Running without the SUID sandbox!
    

    在这些情况下,您需要:

    • 在构建 chrome 时构建 chrome_sandboxninja -C xxx chrome chrome_sandbox 而不是 ninja -C xxx chrome
    • 构建完成后,执行update-linux-sandbox.sh

      # needed if you build on NFS!
      sudo cp out/Debug/chrome_sandbox /usr/local/sbin/chrome-devel-sandbox
      sudo chown root:root /usr/local/sbin/chrome-devel-sandbox
      sudo chmod 4755 /usr/local/sbin/chrome-devel-sandbox
      
    • 最后,您必须在~/.bashrc(或.zshenv)中包含以下行:

      export CHROME_DEVEL_SANDBOX=/usr/local/sbin/chrome-devel-sandbox        
      

    【讨论】:

      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 2020-12-26
      • 2021-12-27
      • 2015-04-26
      • 2015-07-01
      • 2018-07-15
      • 2017-12-26
      • 1970-01-01
      相关资源
      最近更新 更多