Alpine Linux Docker容器中ChromeDriver进程提前终止问题求助
问题:Alpine Linux容器中运行ChromeDriver报错:Driver server process died prematurely
本地运行正常的代码
switch (browserName) { case "Chrome": //System.setProperty("webdriver.chrome.driver", "src/test/resources/drivers/chromedriver.exe"); *WebDriverManager.chromedriver().setup();* ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.addArguments("disable-infobars"); chromeOptions.addArguments("javascript.enabled"); chromeOptions.addArguments("--remote-allow-origins=*"); chromeOptions.addArguments("--headless"); chromeOptions.addArguments("--proxy-server=http://" + proxy); driver = new ChromeDriver(chromeOptions);
Docker容器运行时的错误日志
Caused by: org.openqa.selenium.WebDriverException: Driver server process died prematurely. Build info: version: '4.8.3', revision: 'e5e76298c3' System info: os.name: 'Linux', os.arch: 'amd64', os.version: '5.10.16.3-microsoft-standard-WSL2', java.version: '17.0.7' Driver info: driver.version: ChromeDriver at org.openqa.selenium.remote.service.DriverService.start(DriverService.java:234) at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:114) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:543) ... 59 more
使用的依赖版本
<selenium-java>4.8.3</selenium-java> <webdrivermanager>5.3.2</webdrivermanager> <maven-assembly-plugin>3.6.0</maven-assembly-plugin> <testng>7.5</testng> <maven-resources-plugin>3.3.0</maven-resources-plugin> <mssql-jdbc>11.2.1.jre8</mssql-jdbc> <log4j-api>2.19.0</log4j-api> <log4j-core>2.19.0</log4j-core> <openxml4j>1.0-beta</openxml4j> <windowsazure-api>0.4.6</windowsazure-api> <azure-storage>3.1.0</azure-storage> <azure-keyvault>1.2.6</azure-keyvault> <adal4j>1.6.7</adal4j> <json-simple>1.1.1</json-simple> <json-path>2.7.0</json-path> <guava>31.0.1-jre</guava> <cucumber-java>7.11.2</cucumber-java> <cucumber-testng>7.11.2</cucumber-testng> <extentreports>5.0.9</extentreports> <assert4j>3.20.2</assert4j>
解决方案
1. 补充Alpine容器中Chrome运行的依赖
Alpine使用musl libc,而Chrome依赖glibc及其他系统库,需在Dockerfile中安装:
FROM bellsoft/liberica-openjdk-alpine:17.0.7 # 安装Chromium浏览器、驱动及依赖库 RUN apk add --no-cache chromium chromium-chromedriver \ && apk add --no-cache libstdc++ glib nss freetype harfbuzz ca-certificates ttf-dejavu # 设置环境变量指定路径 ENV CHROME_BIN=/usr/bin/chromium-browser ENV CHROME_DRIVER=/usr/bin/chromedriver
2. 修改代码适配容器环境
- 让WebDriverManager使用系统已安装的chromedriver,避免自动下载适配glibc的版本:
WebDriverManager.chromedriver().useSystemDriver().setup();
- 补充ChromeOptions的容器适配参数:
ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.setBinary("/usr/bin/chromium-browser"); // 指定容器中Chrome路径 chromeOptions.addArguments("disable-infobars"); chromeOptions.addArguments("javascript.enabled"); chromeOptions.addArguments("--remote-allow-origins=*"); chromeOptions.addArguments("--headless=new"); // Selenium 4.8+推荐的新无头模式 chromeOptions.addArguments("--proxy-server=http://" + proxy); // 容器环境必备参数 chromeOptions.addArguments("--no-sandbox"); // 禁用沙箱,容器无法使用沙箱模式 chromeOptions.addArguments("--disable-dev-shm-usage"); // 避免/dev/shm空间不足 chromeOptions.addArguments("--window-size=1920,1080"); // 固定窗口大小防止渲染异常
3. 验证运行权限
运行容器时,确保程序对Chrome和chromedriver有执行权限;若使用非root用户,需提前配置对应权限。
内容的提问来源于stack exchange,提问作者Abdulla Suhail
相关产品推荐
相关产品推荐

