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

Docker中初始化Selenium Chrome WebDriver时无限挂起问题

Docker中Chrome WebDriver初始化无限挂起的问题排查与解决

核心原因分析

从回溯信息看,程序卡在socket接收响应环节,说明ChromeDriver无法成功启动Chrome进程,或者启动后无法建立通信,常见原因有:

  • Chrome与ChromeDriver版本不匹配:Selenium 4.16绑定的ChromeDriver对应特定Chrome版本(主版本需完全一致,比如114/115/116),版本不符会导致启动失败但无报错。
  • 缺少Chrome运行依赖:Docker基础镜像(如debian slim、alpine)默认没有预装Chrome所需的系统库,导致Chrome启动异常。
  • 旧版Headless参数失效:Chrome 112+推出了新的Headless模式,旧的--headless参数在部分环境下会引发兼容性问题。
  • 资源/权限限制:即使加了--no-sandbox和--disable-dev-shm-usage,仍可能存在/dev/shm空间不足或用户权限不足的情况。

解决步骤

1. 校验版本匹配度

执行以下命令查看容器内版本:

# 查看Chrome版本
google-chrome --version
# 查看ChromeDriver版本
chromedriver --version

两者主版本号必须完全一致(比如都是115.x),不匹配的话要么升级/降级Chrome,要么更换对应版本的Selenium。

2. 安装Chrome依赖库

如果是Debian/Ubuntu系镜像,执行以下命令补全依赖:

apt-get update && apt-get install -y \
    libnss3 libxss1 libasound2 libatk1.0-0 \
    libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 \
    libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
    libgbm1 libpango-1.0-0 libcairo2 libatspi2.0-0

Alpine镜像的话需要用apk add安装对应包(比如nss、atk等)。

3. 更新Headless参数

把代码里的--headless替换为--headless=new,这是Chrome官方推荐的新Headless模式,兼容性更好:

import selenium.webdriver.chrome.options as selenium_options
from selenium import webdriver

opts = selenium_options.Options()
opts.add_argument('--disable-dev-shm-usage')
opts.add_argument('--no-sandbox')
opts.add_argument('--headless=new')  # 替换为新参数

driver = webdriver.Chrome(options=opts)

4. 优化资源与权限

  • 启动容器时指定更大的shm空间:docker run --shm-size=256m ...,避免/dev/shm不足导致Chrome启动失败。
  • 若用非root用户运行容器,确保用户有足够权限,或者临时用--privileged参数启动容器排查(生产环境不建议)。
  • 可额外添加--disable-gpu参数,部分环境下能解决启动异常。

5. 启用日志定位问题

在代码中添加日志参数,查看Chrome启动的详细日志:

opts.add_argument('--verbose')
opts.add_argument('--log-path=/tmp/chrome.log')

程序挂起后查看/tmp/chrome.log,里面会记录Chrome启动时的具体错误,方便精准排查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:08:10