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
相关产品推荐
相关产品推荐

