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。
安装必要的 Alpine 软件包。
apk add chromium chromium-chromedriver chromium-swiftshader
在您的图像中设置
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
确保在您的
e2e/protractor.conf.js
内容中包含这些内容。请注意,您不必指定--no-sandbox
chrome 是否以其他用户身份运行并且拥有多用户容器。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 月正在进行的工作