Alpineでng e2eを実行する方法:現在のE /ランチャーを返します。エラー:生成5 いいえ

Alpineでng e2eを実行する方法:現在のE /ランチャーを返します。エラー:生成5 いいえ

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.2Alpineには/lib64/ld-linux-x86-64.so.2ありません。これは webdriver が GNU Libc でコンパイルされます。 Alpine は MUSL を使用するためです。我々はまだそれを動作させることができます。ただ、AlpineのChrome Webドライバを使用する必要があります。

ng e2eアルパイン/MUSLで走る

この方法はAlpineのChrome Webドライバに適しています。

  1. 必要な Alpine パッケージをインストールします。

    apk add chromium chromium-chromedriver chromium-swiftshader
    
  2. と画像を設定してくださいCHROMIUM_FLAGS CHROME_BINCHROME_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月現在進行中の作業

関連情報