Docker部署Python+ChromeDriver环境Chrome启动崩溃问题求助
问题背景
本地Mac环境下Python3.12 + Chrome/ChromeDriver123.0.6312.58运行正常,但部署到基于Ubuntu20.04的Docker容器后,Chrome启动崩溃,错误日志如下:
024-03-20 19:53:58 03/20/2024 06:53:58PM - ERROR - helper_functions.py::helper_functions::init:36 - Chrome driver exception: Message: session not created: Chrome failed to start: crashed.
2024-03-20 19:53:58 (disconnected: unable to connect to renderer)
2024-03-20 19:53:58 (The process started from chrome location /usr/local/bin/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
以下是针对性的排查及解决方案:
1. 强制添加无头模式与Docker适配启动参数
Docker容器无图形界面,必须启用Chrome无头模式,并添加Docker环境必备的参数。修改你的Selenium Chrome配置代码:
from selenium.webdriver.chrome.options import Options def init_chrome_options(): options = Options() # 启用新版无头模式 options.add_argument("--headless=new") # 禁用沙箱(Docker容器无沙箱权限,必须开启) options.add_argument("--no-sandbox") # 禁用/dev/shm使用(Ubuntu默认/dev/shm空间过小,易导致Chrome崩溃) options.add_argument("--disable-dev-shm-usage") # 适配容器窗口大小 options.add_argument("--window-size=1920,1080") # 禁用GPU(无头模式无需) options.add_argument("--disable-gpu") # 忽略证书错误(可选,根据测试场景调整) options.add_argument("--ignore-certificate-errors") return options
2. 补全Docker镜像中Chrome依赖库
你的Dockerfile已安装部分依赖,但仍可能缺失关键库。更新Dockerfile中的依赖安装命令:
RUN apt-get update && apt-get install -y --no-install-recommends \ libgbm1 gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 \ libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libnss3 lsb-release xdg-utils wget libu2f-udev \ && apt-get clean && rm -rf /var/lib/apt/lists/*
- 新增
libu2f-udev:Chrome依赖的USB设备支持库 - 清理apt缓存:减少镜像体积
3. 验证Chrome在容器内的可执行性
进入容器直接测试Chrome是否能运行,排除安装问题:
# 进入运行中的容器 docker exec -it <容器ID> /bin/bash # 测试Chrome无头模式启动 chrome --headless=new --no-sandbox --disable-dev-shm-usage --dump-dom https://www.google.com
- 若命令输出HTML内容,说明Chrome本身正常,问题出在Selenium配置
- 若报错,检查Chrome安装路径或依赖是否缺失
4. 规范Selenium驱动初始化代码
Selenium4.18推荐使用Service类管理驱动,避免旧版写法的兼容性问题:
from selenium import webdriver from selenium.webdriver.chrome.service import Service options = init_chrome_options() # 指定ChromeDriver路径 service = Service(executable_path='/usr/local/bin/chromedriver') driver = webdriver.Chrome(service=service, options=options)
5. 调整容器资源限制
Docker默认内存限制可能不足,Chrome启动需要至少1GB内存,运行容器时增加内存配额:
docker run -m 2g <你的镜像名称>
内容的提问来源于stack exchange,提问作者Seroney

