You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 10:24:31