Docker

如何讓 ng e2e 在 Alpine 下執行:它目前返回 E/launcher - 錯誤:spawn <location> 5 ENOENT

  • December 7, 2021

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/launcher - 錯誤: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']
}

但沒有新的事情發生。

跳入容器,我能夠確認文件存在,但我無法執行它,

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

我可以確認它是+x,當我執行file它時,它說,

chromedriver_96.0.4664.45:ELF 64 位 LSB pie 執行檔,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
  1. 在您的圖像中設置一個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
  1. 在你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 &lt;PATH&gt; chromedriver_96.0.4664.45: __mbrlen: symbol not found
Error relocating &lt;PATH&gt;/chromedriver_96.0.4664.45: __close: symbol not found
Error relocating &lt;PATH&gt;/chromedriver_96.0.4664.45: random_r: symbol not found
Error relocating &lt;PATH&gt;/chromedriver_96.0.4664.45: initstate_r: symbol not found

截至 2021 年 12 月,gcompat 似乎更像是一項正在進行的工作

ENOENT是缺少動態連結器的典型症狀;參見例如 為什麼 chroot 會在現有文件上獲得 ENOENT?

如果您想在容器中執行基於 glibc 的二進製文件,最好使用基於 glibc 的基礎鏡像,而不是基於 musl 的鏡像(如 Alpine)。

有許多基本圖像可以滿足您的要求,要真正推荐一個,我需要更多地了解它們的真正含義。

引用自:https://unix.stackexchange.com/questions/680533