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

Odoo模型中Undetected Chrome Driver无法正常运行问题求助

Odoo + Docker + Undetected Chrome Driver: Service Unexpectedly Exited with Status Code -5

问题回顾

我在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版本不匹配。

操作步骤:

  1. 在Docker容器内运行google-chrome --version,获取当前Chrome版本(比如128.0.6613.119)。
  2. 在requirements.txt中指定兼容的UC版本,比如对应Chrome 128的版本是undetected-chromedriver==4.19.1(可通过UC的release notes确认对应关系)。
  3. 重新构建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 12:28:13