npx ng e2e
저는 GitLab의 docker CI 환경에서 실행 중입니다. 이것을 실행하면 완전히 정상적인 크롬/웹드라이버 설정/설치가 이루어집니다.
[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 기반 기본 이미지를 사용하는 것이 더 좋습니다.
귀하의 요구 사항을 충족해야 하는 기본 이미지가 많이 있습니다. 실제로 하나를 추천하려면 해당 이미지가 정확히 무엇인지 더 알아야 합니다.
답변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의 크롬 웹 드라이버를 사용해야 합니다.
ng e2e
알파인/MUSL에서 달리기
이 방법은 Alpine의 크롬 웹드라이버에 적합합니다.
필요한 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월 현재 진행 중인 작업