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

python:3.9 Docker容器内运行Selenium报Chrome启动异常如何解决

问题根因

  • 驱动和浏览器类型不匹配:你容器内安装的是开源版chromium,但代码中ChromeDriverManager指定的是ChromeType.GOOGLE(对应谷歌官方闭源Chrome),二者路径、版本匹配规则都不一致,导致驱动无法找到正确的浏览器可执行文件
  • 缺少Docker环境下必要的Chrome启动参数:Docker默认没有沙箱运行权限,且共享内存/dev/shm空间极小,Chrome默认配置无法在该环境下启动
  • 系统依赖不全:仅安装chromium-driver缺少Chromium运行所需的基础依赖包,容易出现启动崩溃

修复步骤

第一步:完善Dockerfile配置

把原来的依赖安装行替换为以下内容,先更新源再安装全量依赖,同时避免安装冗余包:

RUN apt-get update && apt-get install -y --no-install-recommends \
    chromium \
    chromium-driver \
    fonts-wqy-zenhei \
    libnss3 \
    libgbm-dev \
    libxss1 \
    libasound2 \
    && rm -rf /var/lib/apt/lists/*

第二步:修改Python Selenium启动配置

  1. 停止使用ChromeDriverManager动态下载驱动,直接使用容器内已安装的固定版本驱动,避免版本不匹配问题
  2. 新增3个必选启动参数:--no-sandbox关闭沙箱权限校验、--disable-dev-shm-usage使用磁盘临时文件替代共享内存、--disable-gpu关闭GPU渲染适配无头模式
  3. 把旧版--headless参数替换为--headless=new,使用Chrome新版无头模式,稳定性更高
  4. 明确指定Chromium的安装路径,避免驱动找不到浏览器

修改后的代码示例:

@staticmethod
def fetch_music_download_url(music_name: str):
    # 直接指定容器内已安装的chromedriver路径,不需要动态下载
    chrome_driver_service = Service("/usr/bin/chromedriver")
    chrome_options = Options()
    chrome_options.add_argument("--headless=new")
    chrome_options.add_argument("--remote-debugging-port=9222")
    # 新增Docker环境必选参数
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-dev-shm-usage")
    chrome_options.add_argument("--disable-gpu")
    # 明确指定chromium的安装路径
    chrome_options.binary_location = "/usr/bin/chromium"
    driver = webdriver.Chrome(service=chrome_driver_service,options=chrome_options)
    # 后续原有逻辑保持不变
    driver.get('http://tool.liumingye.cn/music/?page=audioPage&type=migu&name=' + music_name)
    driver.implicitly_wait(5)
    driver.find_element(By.CSS_SELECTOR, ".aplayer-list-download.iconfont.icon-xiazai").click()
    urls = [a.get_attribute('href') for a in
            driver.execute_script('return document.querySelectorAll(".modal-body a[href*=\'http\']")')]
    for url in urls:
        if url.contains("listenSong.do"):
            FetchMusic.do_save_music_download_url(url)
    # 补充:运行结束后关闭driver,避免资源泄漏
    driver.quit()

额外验证步骤

如果还有启动失败的情况,可以手动进入容器执行/usr/bin/chromium --headless=new --no-sandbox https://www.baidu.com,看是否能正常运行,排查是否有遗漏的依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:15:07