Odoo模型中Undetected Chrome Driver无法正常运行问题求助
问题回顾
我在Docker容器化部署的Odoo 18模型中,通过动作按钮触发网站爬取操作——因为要爬取受Cloudflare保护的站点,所以改用了Undetected Chrome Driver(UC);此前普通Selenium驱动和Selenium Grid都没解决问题,现在本地脚本运行正常,但在Odoo环境下触发时,报错:
Service /var/lib/odoo/.local/share/undetected_chromedriver/undetected_chromedriver unexpectedly exited. Status code was: -5
已尝试调整Chrome启动参数、移除--no-sandbox、指定驱动路径,但问题依旧。
相关代码片段:
def _get_chrome_driver(self): # Set up Chrome options for better stability chrome_options = Options() chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-software-rasterizer') chrome_options.add_argument('--disable-setuid-sandbox') chrome_options.add_argument('--headless=new') chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--window-size=1920,1080') chrome_options.add_argument( '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36') try: driver = uc.Chrome( options=chrome_options, ) _logger.info("Successfully connected to Selenium Grid Hub") return driver except WebDriverException as e: _logger.error(f"Failed to create Chrome driver: {str(e)}") raise
Dockerfile配置:
FROM odoo:18 USER root RUN apt-get update && apt-get install -y wget unzip gnupg curl && \ wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | gpg --dearmor > /etc/apt/trusted.gpg.d/google-chrome.gpg && \ echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list && \ apt-get update && apt-get install -y google-chrome-stable chromium-driver && \ rm -rf /var/lib/apt/lists/* COPY ./requirements.txt /tmp/requirements.txt RUN pip3 install -r /tmp/requirements.txt --break-system-packages --ignore-installed ENV LANG=C.UTF-8 ENV LC_ALL=C.UTF-8 USER odoo
针对性解决方案
1. 修复权限与路径问题(最可能的原因)
状态码-5通常和权限不足或路径不可写有关:UC默认会把驱动下载到/var/lib/odoo/.local/share/,但Odoo用户可能没有该目录的写权限,或者目录不存在。
修改代码:指定UC使用Odoo用户可写的临时目录,并明确驱动路径:
def _get_chrome_driver(self): chrome_options = Options() # 保留你的原有参数,新增/调整以下配置 chrome_options.add_argument('--user-data-dir=/tmp/uc_chrome_profile') # 指定可写的用户数据目录 chrome_options.add_argument('--disable-extensions') # 减少冲突 try: driver = uc.Chrome( options=chrome_options, user_data_dir='/tmp/uc_chrome_profile', # 同步UC的用户数据目录 driver_executable_path='/usr/bin/chromedriver', # 使用Docker中安装的chromium-driver browser_executable_path='/usr/bin/google-chrome-stable' # 指定Chrome可执行文件路径 ) _logger.info("Successfully initialized Undetected Chrome Driver") return driver except WebDriverException as e: _logger.error(f"Failed to create Chrome driver: {str(e)}") # 新增调试日志,查看Chrome启动详情 import traceback _logger.error(traceback.format_exc()) raise
修改Dockerfile:提前创建临时目录并赋予Odoo用户权限:
# 在USER odoo之前添加 RUN mkdir -p /tmp/uc_chrome_profile && chown odoo:odoo /tmp/uc_chrome_profile && chmod 755 /tmp/uc_chrome_profile
2. 确保Chrome与UC版本兼容
UC对Chrome版本有严格要求,Docker中安装的google-chrome-stable可能是最新版,而你的undetected-chromedriver版本不匹配。
操作步骤:
- 在Docker容器内运行
google-chrome --version,获取当前Chrome版本(比如128.0.6613.119)。 - 在
requirements.txt中指定兼容的UC版本,比如对应Chrome 128的版本是undetected-chromedriver==4.19.1(可通过UC的release notes确认对应关系)。 - 重新构建Docker镜像。
3. 补充Chrome依赖库
Docker的Odoo基础镜像可能缺少Chrome运行必需的系统库,导致Chrome无法启动。
更新Dockerfile:在安装Chrome前补充依赖:
RUN apt-get update && apt-get install -y \ wget unzip gnupg curl \ libglib2.0-0 libnss3 libgconf-2-4 libfontconfig1 libx11-6 libxext6 libxrender1 libxi6 libxss1 libasound2 \ && ... 后续安装Chrome的命令不变
4. 调整Headless模式参数
--headless=new在某些环境下可能存在兼容性问题,尝试切换为旧版Headless模式:
chrome_options.add_argument('--headless=chrome') # 替换原有的--headless=new
同时添加参数减少Chrome的后台活动:
chrome_options.add_argument('--disable-background-networking') chrome_options.add_argument('--disable-features=VizDisplayCompositor')
5. 启用UC调试日志
开启UC的调试模式,获取更详细的启动错误信息,帮助定位问题:
driver = uc.Chrome( options=chrome_options, debug=True, # 启用调试日志 # 其他参数不变 )
查看Odoo的日志,你会看到Chrome启动时的详细输出,比如缺失的库、权限错误等具体信息。
内容的提问来源于stack exchange,提问作者Chikara

