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启动配置
- 停止使用
ChromeDriverManager动态下载驱动,直接使用容器内已安装的固定版本驱动,避免版本不匹配问题 - 新增3个必选启动参数:
--no-sandbox关闭沙箱权限校验、--disable-dev-shm-usage使用磁盘临时文件替代共享内存、--disable-gpu关闭GPU渲染适配无头模式 - 把旧版
--headless参数替换为--headless=new,使用Chrome新版无头模式,稳定性更高 - 明确指定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
相关产品推荐
相关产品推荐

