在Docker中运行Python Selenium爬虫应用遇问题求解决方案
问题分析与修复方案
现有配置与代码中的错误
- 变量名错误:代码中
driver = webdriver.Chrome(executable_path=driverPath,options=option)里的option未定义,应该是chrome_options - 驱动管理工具冲突:Docker中已手动下载chromedriver,同时又依赖
webdriver-manager/chromedriver-py,极易引发版本不匹配问题 - Chrome与Chromedriver版本不兼容:Docker安装的是最新版
google-chrome-stable,但requirements.txt指定chromedriver-py==103.0.5060.53,版本差异会直接导致驱动启动失败 - Chrome启动参数不全:仅添加
--no-sandbox不足以适配Docker环境,缺少无头模式、共享内存优化等关键参数 - 显示服务配置混乱:run.sh注释了Xvfb启动,同时代码中调用
pyvirtualdisplay,两者重复且未正确关联,导致显示环境异常 - Tkinter错误根源:代码中可能隐含调用了Tkinter(如导出/可视化逻辑),在无显示环境下触发该错误
修复步骤
1. 修正爬虫代码
统一Chrome配置,移除冗余驱动工具,正确处理显示环境:
import platform import os from selenium import webdriver # 处理Linux环境下的显示变量 if platform.system() == 'Linux': os.environ['DISPLAY'] = ':99' # 禁用Tkinter GUI(若爬虫无需相关功能) os.environ['PYTHONUNBUFFERED'] = '1' # 配置Chrome核心参数 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--headless=new') # 新版Chrome推荐的无头模式 chrome_options.add_argument('--disable-dev-shm-usage') # 解决Docker共享内存不足问题 chrome_options.add_argument('--window-size=1920,1080') chrome_options.add_argument('--disable-gpu') # 启动虚拟显示(二选一:代码内启动pyvirtualdisplay,或通过run.sh启动Xvfb) if platform.system() == 'Linux': from pyvirtualdisplay import Display display = Display(visible=0, size=(1920, 1080)) display.start() # 使用Docker中预安装的chromedriver driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', options=chrome_options) # 你的爬虫业务逻辑... # 清理资源 driver.quit() if platform.system() == 'Linux': display.stop()
2. 调整Dockerfile,保证版本匹配
精简镜像体积,确保Chrome与Chromedriver版本完全一致:
FROM python:3.10-slim # 安装依赖与Chrome RUN apt-get update && apt-get install -y --no-install-recommends \ wget curl unzip xvfb libglib2.0-0 libnss3 libgconf-2-4 libfontconfig1 \ && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list \ && apt-get update && apt-get install -y google-chrome-stable \ # 下载与当前Chrome匹配的chromedriver && CHROME_VERSION=$(google-chrome --version | grep -oP '\d+\.\d+\.\d+\.\d+') \ && wget -O /tmp/chromedriver.zip https://chromedriver.storage.googleapis.com/$(curl -sS https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_VERSION%.*})/chromedriver_linux64.zip \ && unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/ \ && chmod +x /usr/local/bin/chromedriver \ # 清理缓存减小镜像体积 && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* ENV DISPLAY=:99 # 创建工作目录并复制文件 RUN mkdir -p /app/csv COPY requirements.txt /app/ COPY sample.py /app/ COPY run.sh /app/ WORKDIR /app # 安装Python依赖 RUN pip install --no-cache-dir -r requirements.txt CMD ./run.sh
3. 修改run.sh,正确启动显示服务
推荐使用系统级Xvfb(比pyvirtualdisplay更稳定):
#!/bin/sh # 启动Xvfb虚拟显示服务 Xvfb :99 -screen 0 1920x1080x24 -nolisten tcp & # 启动爬虫脚本 python3 ./sample.py
4. 更新requirements.txt,移除冗余依赖
selenium==4.3.0 pyvirtualdisplay==3.0 # 移除webdriver-manager和chromedriver-py,避免版本冲突
关键注意事项
- 版本一致性:Chrome与Chromedriver的主版本必须完全匹配,否则驱动会直接启动失败
- 无头模式选型:新版Chrome优先使用
--headless=new,避免旧无头模式的兼容性问题 - 镜像优化:Docker中清理apt缓存可大幅减小镜像体积
- 权限配置:
--no-sandbox是Docker环境下运行Chrome的必填参数
内容的提问来源于stack exchange,提问作者Chitraveer Akhil
相关产品推荐
相关产品推荐

