npx ng e2e
私はGitLabのdocker CI環境で実行しています。これを実行すると、完全に正常なChrome / Webドライバの設定/インストールが行われます。
[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 - エラー: generate /builds/cpanel/cpanel/demo-app/node_modules/webdriver-manager/selenium/chromedriver_96.0.4664.45 ENOENT
そこからクロムの解凍がはっきりと見える時
./e2e/protractor.conf.js
様々な形の編集を試してみました。
chromeOptions: {
binary: process.env.CHROME_BIN,
args: ['--no-sandbox', '--headless', '--disable-gpu']
}
しかし、新しいことは起こりません。
答え1
ENOENT
動的リンカーが欠落している典型的な症状です。例えば chrootが既存のファイルからENOENTを取得するのはなぜですか?
コンテナでglibcベースのバイナリを実行するには、muslベースのイメージ(Alpineなど)ではなくglibcベースのベースイメージを使用することをお勧めします。
あなたの要件を満たす必要がある基本的な画像がたくさんあります。実際に1つを推薦するには、その画像が正確に何であるかを知る必要があります。
答え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
アルパイン/MUSLで走る
この方法はAlpineのChrome Webドライバに適しています。
必要な 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月現在進行中の作業