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

Docker运行Chrome+Selenium遇SessionNotCreated报错,求优化方案

Docker环境下Chrome+ChromeDriver+XVFB部署优化方案(解决SessionNotCreatedException)

一、Dockerfile优化方案

  • 选用兼容基础镜像:优先用ubuntu:22.04或debian:bookworm-slim,避免过于精简的镜像缺失依赖
  • 安装Chrome必需系统依赖:补齐图形、音频类库,解决启动时的依赖报错
  • 严格匹配Chrome与ChromeDriver版本:两者版本必须完全一致,这是兼容性问题的核心诱因
  • 禁用Chrome沙箱:Docker容器默认无足够权限运行沙箱,必须显式关闭
  • 预配置XVFB环境变量:提前设置DISPLAY,无需运行时手动指定

优化后的Dockerfile示例:

FROM ubuntu:22.04

# 环境变量配置
ENV DEBIAN_FRONTEND=noninteractive
ENV DISPLAY=:99
# 确保Chrome和ChromeDriver版本完全一致
ENV CHROME_VERSION=128.0.6613.119-1
ENV CHROMEDRIVER_VERSION=128.0.6613.119

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    xvfb \
    wget \
    unzip \
    libnss3 \
    libgconf-2-4 \
    libxss1 \
    libasound2 \
    libatk-bridge2.0-0 \
    libcups2 \
    libdrm2 \
    libxkbcommon0 \
    libxcomposite1 \
    libxrandr2 \
    libgbm1 \
    && rm -rf /var/lib/apt/lists/*

# 安装Google Chrome
RUN wget https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROME_VERSION}_amd64.deb \
    && dpkg -i google-chrome-stable_${CHROME_VERSION}_amd64.deb \
    && apt-get install -f -y \
    && rm google-chrome-stable_${CHROME_VERSION}_amd64.deb

# 安装匹配版本的ChromeDriver
RUN wget https://storage.googleapis.com/chrome-for-testing-public/${CHROMEDRIVER_VERSION}/linux64/chromedriver-linux64.zip \
    && unzip chromedriver-linux64.zip \
    && mv chromedriver-linux64/chromedriver /usr/local/bin/ \
    && chmod +x /usr/local/bin/chromedriver \
    && rm chromedriver-linux64.zip \
    && rm -rf chromedriver-linux64

# 启动命令:先启动XVFB虚拟显示,再运行爬虫脚本
CMD ["sh", "-c", "Xvfb :99 -screen 0 1920x1080x24 & python your_spider_script.py"]

二、Selenium爬虫代码优化方案

核心是配置ChromeOptions参数,解决DevToolsActivePort缺失和Chrome崩溃问题:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

def init_chrome_driver():
    chrome_options = Options()
    # Docker环境必需:禁用沙箱
    chrome_options.add_argument("--no-sandbox")
    # 禁用/dev/shm共享内存,避免容器内存不足导致崩溃
    chrome_options.add_argument("--disable-dev-shm-usage")
    # 指定调试端口,解决DevToolsActivePort文件不存在问题
    chrome_options.add_argument("--remote-debugging-port=9222")
    # 禁用GPU加速,虚拟显示环境下无需启用
    chrome_options.add_argument("--disable-gpu")
    # 设置固定窗口大小,避免布局异常
    chrome_options.add_argument("--window-size=1920x1080")
    # 可选:若无需可视化,启用headless模式(结合XVFB也可不用)
    # chrome_options.add_argument("--headless=new")
    # 显式指定Chrome二进制路径,避免路径查找错误
    chrome_options.binary_location = "/usr/bin/google-chrome"

    return webdriver.Chrome(options=chrome_options)

if __name__ == "__main__":
    # 等待XVFB虚拟显示初始化完成
    time.sleep(2)
    driver = init_chrome_driver()
    try:
        driver.get("https://www.example.com")
        print(driver.title)
    finally:
        driver.quit()

三、额外排查要点

  • 版本一致性验证:容器内执行google-chrome --version和chromedriver --version,确保输出版本完全一致
  • 权限检查:确认Chrome和ChromeDriver有可执行权限,若使用非root用户运行,需额外配置目录权限
  • 录屏工具兼容:若用ffmpeg等工具录屏,确保已安装并正确关联DISPLAY=:99环境变量

内容的提问来源于stack exchange,提问作者Swati Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:55:56