Docker中运行Kibana插件功能测试时遭遇WebDriver会话创建失败(用户数据目录冲突)问题排查
问题背景
你在本地开发Kibana插件时,功能测试可以正常运行,但在Docker容器(Jenkins环境)中执行时,遇到了WebDriver会话创建失败的错误,核心报错是:
SessionNotCreatedError: session not created: probably user data directory is already in use, please specify a unique value for --user-data-dir argument, or don't use --user-data-dir
你已经配置了Chrome安装、Kibana和ES的启动等待逻辑,但还是卡在WebDriver会话创建这一步。
原因分析
这个错误本质是Chrome用户数据目录被重复占用:Docker环境下,Chrome默认的用户数据目录可能被复用,或者目录权限不足导致无法创建新会话;另外Docker隔离环境下跑Chrome,还需要处理沙箱限制、共享内存不足等隐性问题,这些都可能间接引发会话创建失败。
解决方案
结合我自己踩过的类似坑,给你整理几个具体的排查和修复方向:
1. 在测试配置文件中指定唯一Chrome用户数据目录
修改你的config.js,给Chrome添加动态生成的唯一用户数据目录参数,彻底避免冲突:
// 先引入path模块处理路径 const path = require('path'); // ... 其他原有配置代码 ... return { // ... 继承的Kibana基础配置 ... browser: { type: 'chrome', args: [ // Docker环境跑Chrome必须的参数,解决沙箱和内存问题 '--no-sandbox', '--disable-dev-shm-usage', '--headless=new', // 使用Chrome最新的headless模式,兼容性更稳定 // 用时间戳生成唯一的用户数据目录,每次测试都是全新的隔离环境 `--user-data-dir=${path.join(process.env.TMPDIR || '/tmp', `chrome-test-profile-${Date.now()}`)}`, ], }, // ... 其他原有配置 ... };
2. 优化bash脚本的临时目录与浏览器安装逻辑
在脚本开头先确保临时目录存在且权限正确,避免Chrome无法写入数据:
# 脚本最开头添加:创建并授权临时目录 export TMPDIR=/tmp/kibana-test-tmp mkdir -p $TMPDIR chmod 777 $TMPDIR
另外,脚本中安装Chrome的部分,建议直接用puppeteer自带的浏览器管理工具,避免系统安装的Chrome与chromedriver版本不匹配:
# 替换原有Chrome安装代码 cd plugins/my-plugin # 安装puppeteer并自动下载对应版本的Chrome yarn add puppeteer # 获取Chrome二进制文件路径 TEST_BROWSER_BINARY_PATH=$(npx puppeteer browsers path chrome) cd -
3. 移除脚本中的sudo操作,提前在Dockerfile中安装依赖
Docker容器中尽量避免在脚本中用sudo安装依赖,建议把default-jre、chromium-chromedriver等依赖直接写到Dockerfile里,比如:
# Dockerfile中添加: RUN apt-get update && apt-get install -y --no-install-recommends \ default-jre \ chromium-chromedriver \ && rm -rf /var/lib/apt/lists/*
4. 完善ES与Kibana的启动等待逻辑
当前脚本只等待Kibana启动,但功能测试依赖ES的就绪状态,建议添加ES的健康检查:
# 启动ES后等待其就绪 yarn es snapshot & # 等待ES集群状态变为green或yellow while ! curl -s http://localhost:9200/_cluster/health | grep -q '"status":"green"\|"status":"yellow"'; do echo "Waiting for Elasticsearch to be ready..." sleep 10 done # 原有Kibana启动与等待逻辑保持不变 (NODE_OPTIONS="--max-old-space-size=4096" yarn start --no-base-path >startup.log &) && \ while ! grep -q "Kibana is now available" "startup.log"; do echo "Pattern not found, checking again..." tail startup.log sleep 10 done
验证修改
把以上调整应用后,重新在Docker容器中执行测试脚本,应该可以成功创建WebDriver会话,顺利运行Kibana插件的功能测试。
内容来源于stack exchange

