Docker容器内Jenkins构建任务报错Chrome启动崩溃问题求助
Docker环境ChromeDriver启动崩溃(DevToolsActivePort不存在)解决方案
问题根因
你遇到的报错本质是Docker容器默认非特权运行模式下,Chrome内置沙箱机制无法正常初始化,同时Docker默认分配的/dev/shm共享内存容量过小、DevTools动态端口生成失败共同导致的,和Chrome、ChromeDriver版本匹配无关。
核心解决方案
1. Selenium启动Chrome时添加必填参数
你需要在测试代码的ChromeOptions配置中新增三个启动参数,这是Chrome官方给出的Docker环境适配方案:
--no-sandbox:关闭Chrome沙箱校验,适配容器非特权运行环境--disable-dev-shm-usage:禁用/dev/shm临时存储,改用/tmp目录存储临时文件,避免共享内存不足--remote-debugging-port=9222:固定DevTools调试端口,解决端口生成文件找不到的报错
不同开发语言的配置示例如下:
Java示例
import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.chrome.ChromeDriver; // 初始化配置 ChromeOptions options = new ChromeOptions(); // 新增三个适配参数 options.addArguments("--no-sandbox"); options.addArguments("--disable-dev-shm-usage"); options.addArguments("--remote-debugging-port=9222"); // 原有其余配置(如xvfb相关配置)保持不变 WebDriver driver = new ChromeDriver(options);
Node.js WebDriverIO示例
从你给出的日志可以看到你使用了Node.js的webdriver框架,修改capabilities配置即可:
exports.config = { // 其余原有配置保持不变 capabilities: [{ browserName: 'chrome', 'goog:chromeOptions': { args: [ // 新增三个适配参数 '--no-sandbox', '--disable-dev-shm-usage', '--remote-debugging-port=9222', // 原有其余启动参数保持不变 ] } }] }
Python示例
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--remote-debugging-port=9222") # 原有其余配置保持不变 driver = webdriver.Chrome(options=chrome_options)
2. 可选:补充Dockerfile依赖
如果添加参数后仍启动失败,可修改Dockerfile补充字体依赖、添加ChromeDriver执行权限,避免因依赖缺失导致崩溃:
FROM jenkins/jenkins:latest ENV JAVA_OPTS -Djenkins.install.runSetupWizard=false ENV CASC_JENKINS_CONFIG /var/jenkins_home/casc.yaml COPY plugins.txt /usr/share/jenkins/ref/plugins.txt RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt COPY casc.yaml /var/jenkins_home/casc.yaml USER root RUN apt-get update && apt-get install wget unzip \ # 新增字体依赖,解决Chrome缺字崩溃问题 && apt-get install -y nodejs npm fonts-liberation fonts-wqy-zenhei \ # 原有Chrome、ChromeDriver安装步骤,新增执行权限配置 && wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \ && apt-get install -y ./google-chrome-stable_current_amd64.deb \ && wget https://chromedriver.storage.googleapis.com/93.0.4577.15/chromedriver_linux64.zip \ && unzip chromedriver_linux64.zip && mv chromedriver /usr/bin/chromedriver \ && chmod +x /usr/bin/chromedriver USER jenkins
补充说明
你已配置xvfb无界面运行,不需要额外添加--headless参数,如果后续希望不依赖xvfb运行,可在Chrome启动参数中添加--headless=new即可直接无界面启动Chrome。
内容的提问来源于stack exchange,提问作者Cyprowolf N
相关产品推荐
相关产品推荐

