Selenium本地运行正常但Docker环境下出现SessionNotCreatedException的问题排查求助
Selenium本地运行正常但Docker环境下出现SessionNotCreatedException的问题排查求助
遇到本地跑的好好的Selenium脚本一到Docker环境就崩的情况,真的挺闹心的!我之前也踩过类似的坑,结合你的描述,给你几个具体的排查方向和解决方案试试:
1. 补上Chrome运行必需的系统依赖
你的Docker基础镜像是tomcat:10-jdk17-openjdk,这个镜像只包含Tomcat和JDK环境,缺少Chrome运行需要的底层依赖(比如libnss3、libatk1.0-0这类系统库)。虽然你从standalone-chrome镜像复制了chrome和chromedriver,但没把配套的依赖带过来,这大概率是Chrome启动失败的核心原因。
可以在Dockerfile里添加安装依赖的步骤:
FROM <url>/standalone-chrome:4.23.1 as chrome FROM <url>/tomcat:10-jdk17-openjdk ENV JAVA_OPTS="-Xmx4096M -Xms4096M" # 安装Chrome运行所需的系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ libnss3 \ libatk1.0-0 \ libatk-bridge2.0-0 \ libcups2 \ libdrm2 \ libxkbcommon0 \ libxcomposite1 \ libxdamage1 \ libxfixes3 \ libxrandr2 \ libgbm1 \ libasound2 \ && rm -rf /var/lib/apt/lists/* ADD target/<javaproject>-*.jar /target/<java-project>.jar COPY --from=chrome /usr/bin/google-chrome /usr/bin/google-chrome COPY --from=chrome /usr/bin/chromedriver /usr/bin/chromedriver # 确保chrome和chromedriver有执行权限 RUN chmod +x /usr/bin/google-chrome /usr/bin/chromedriver CMD java --add-opens java.base/java.lang.reflect=ALL-UNNAMED -jar /target/*.jar -Dlogging.level.org.openqa.selenium=DEBUG
2. 调整ChromeOptions的启动参数
Docker环境下的无头Chrome需要额外的参数才能稳定运行,修改你的Java代码配置:
log.info("Setting the path to the driver"); System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver"); ChromeOptions options = new ChromeOptions(); options.addArguments("--headless=new"); // 用新版无头模式,兼容性更好 options.addArguments("--no-sandbox"); // 容器内必须加,绕过用户权限沙箱限制 options.addArguments("--disable-dev-shm-usage"); // 解决容器共享内存不足的问题 options.addArguments("--disable-gpu"); // 无头模式下不需要GPU加速 options.addArguments("--remote-debugging-port=9222"); // 可选,方便远程调试Chrome状态 log.info("starting web driver"); WebDriver driver = new ChromeDriver(options);
3. 验证Chrome与ChromeDriver的版本兼容性
虽然你是从同一个standalone-chrome镜像复制的两个文件,但还是要确认版本完全匹配:
进入容器执行以下命令,检查版本是否一致:
google-chrome --version chromedriver --version
要是大版本不匹配,直接会导致Driver进程启动即崩溃。
4. 换一种镜像构建思路
如果上面的方法都没效果,可以尝试直接基于standalone-chrome镜像构建,这样能保证所有依赖都是为Chrome运行量身定制的:
FROM <url>/standalone-chrome:4.23.1 ENV JAVA_OPTS="-Xmx4096M -Xms4096M" # 安装JDK17(如果镜像自带的JDK版本不符合需求) RUN apt-get update && apt-get install -y openjdk-17-jdk && rm -rf /var/lib/apt/lists/* ADD target/<javaproject>-*.jar /target/<java-project>.jar CMD java --add-opens java.base/java.lang.reflect=ALL-UNNAMED -jar /target/*.jar -Dlogging.level.org.openqa.selenium=DEBUG
5. 查看更详细的崩溃日志
可以手动进入容器调试,定位具体的崩溃原因:
- 进入容器:
docker exec -it <容器ID> /bin/bash - 运行chromedriver看输出:
chromedriver --verbose - 尝试启动Chrome:
google-chrome --headless --no-sandbox --disable-dev-shm-usage --dump-dom https://www.google.com
这些输出会告诉你到底是Chrome启动失败,还是chromedriver本身的问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

