如何让 ng e2e 在 Alpine 下运行:它当前返回 E/launcher - 错误:spawn5 诺恩特

如何让 ng e2e 在 Alpine 下运行:它当前返回 E/launcher - 错误:spawn5 诺恩特

npx ng e2e我正在GitLab 下的 docker CI 环境中运行。当我运行它时,我得到了完全普通的 chrome/webdriver 设置/安装。

[19:57:28] I/file_manager - creating folder /builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium
[19:57:28] I/config_source - curl -o/builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium/chrome-response.xml https://chromedriver.storage.googleapis.com/
[19:57:29] I/downloader - curl -o/builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium/chromedriver_96.0.4664.45.zip https://chromedriver.storage.googleapis.com/96.0.4664.45/chromedriver_linux64.zip
[19:57:30] I/update - chromedriver: unzipping chromedriver_96.0.4664.45.zip
[19:57:31] I/update - chromedriver: setting permissions to 0755 for /builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium/chromedriver_96.0.4664.45
Compiling @angular/core : es2015 as esm2015
... lots more compiling stuff..

随后执行失败,

[19:58:07] I/launcher - Running 1 instances of WebDriver
[19:58:07] I/direct - Using ChromeDriver directly...
[19:58:07] E/launcher - spawn /builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium/chromedriver_96.0.4664.45 ENOENT
[19:58:07] E/launcher - Error: spawn /builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium/chromedriver_96.0.4664.45 ENOENT
    at Process.ChildProcess._handle.onexit (node:internal/child_process:282:19)
    at onErrorNT (node:internal/child_process:475:16)
    at processTicksAndRejections (node:internal/process/task_queues:83:21)
[19:58:07] E/launcher - Process exited with error code 199

为什么我会得到,

E/启动器 - 错误:spawn /builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium/chromedriver_96.0.4664.45 ENOENT

当我可以清楚地看到 chrome 在那里解压时


./e2e/protractor.conf.js我尝试过使用不同形式的编辑

chromeOptions: {
  binary: process.env.CHROME_BIN,
  args: ['--no-sandbox', '--headless', '--disable-gpu']
}

但没有什么新的事情发生。

答案1

ENOENT是缺少动态链接器的典型症状;看例如 为什么 chroot 在现有文件上得到 ENOENT?

如果您想在容器中运行基于 glibc 的二进制文件,最好使用基于 glibc 的基础镜像,而不是基于 musl 的镜像(如 Alpine)。

有许多基本图像应该满足您的要求,要真正推荐一个,我需要更多地了解它们到底是什么。

答案2

跳入容器我能够确认该文件存在,但我无法运行它,

# ./chromedriver_96.0.4664.45
/bin/sh: ./chromedriver_96.0.4664.45: not found

我可以确认它是+x,当我运行file它时,它说,

chromedriver_96.0.4664.45:ELF 64 位 LSB 饼可执行文件,x86-64,版本 1 (SYSV),动态链接、解释器/lib64/ld-linux-x86-64.so.2,对于 GNU/Linux 3.2.0,BuildID[sha1]=c44e075047fbfa647481929b2820890db74143ba,已删除

我用readelf -l文件的输出确认了。在我的主机上/lib64/ld-linux-x86-64.so.2存在,但在 Alpine 上/lib64/ld-linux-x86-64.so.2不存在。这是因为 webdriver 被编译为 GNU Libc,但 Alpine 使用 MUSL。我们仍然可以让它工作,我们只需要使用 Alpine 的 chrome web 驱动程序。

ng e2e在 Alpine/MUSL 下运行

此方法适用于 Alpine 下的 chromium webdriver。

  1. 安装必要的 Alpine 软件包。

    apk add chromium chromium-chromedriver chromium-swiftshader
    
  2. 在您的图像中设置CHROMIUM_FLAGS CHROME_BIN和。CHROME_PATH

    CHROMIUM_FLAGS=--headless --disable-dev-shm-usage --disable-software-rasterizer
    CHROME_BIN=/usr/bin/chromium-browser
    CHROME_PATH=/usr/lib/chromium
    
  3. 确保在您的e2e/protractor.conf.js内容中包含这些内容。请注意,您不必指定--no-sandboxchrome 是否以其他用户身份运行并且拥有多用户容器。

    const path = require('path');
    
    exports.config = {
      chromeDriver: path.join(process.env.CHROME_PATH, 'chromedriver'),
      capabilities: {
        browserName: 'chrome',
        chromeOptions: {
          args: ["--no-sandbox"],
          binary: process.env.CHROME_BIN,
        }
      },
    

不好的解决方案:gcompat

官方建议建议安装gcompat此功能不起作用并返回以下错误,

Error relocating <PATH> chromedriver_96.0.4664.45: __mbrlen: symbol not found
Error relocating <PATH>/chromedriver_96.0.4664.45: __close: symbol not found
Error relocating <PATH>/chromedriver_96.0.4664.45: random_r: symbol not found
Error relocating <PATH>/chromedriver_96.0.4664.45: initstate_r: symbol not found

看来 gcompat 更像是一个截至 2021 年 12 月正在进行的工作

相关内容