Docker Ubuntu环境Selenium调用Chrome启动异常退出问题咨询
问题修复方案
1. 核心配置错误(直接触发当前报错)
你代码中BinaryLocation配置完全错误:当前设置的/driver/是存放chromedriver可执行文件的目录,不是Chrome浏览器本身的二进制路径,ChromeDriver会尝试从该路径启动Chrome进程,自然直接崩溃退出。
报错信息已经明确指向该问题:
The process started from chrome location /driver/ is no longer running, so ChromeDriver is assuming that Chrome has crashed.
通过deb包安装的Chrome在Ubuntu下默认二进制路径为/usr/bin/google-chrome-stable,你可以显式指定该路径,也可以删除该配置让ChromeDriver自动从系统PATH中查找已安装的Chrome。
2. Dockerfile 缺失依赖与优化
你当前的Dockerfile存在依赖缺失、冗余步骤、安装逻辑不完整的问题,修正后的运行阶段配置如下:
# run FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal-amd64 as runtime # 容器内默认是root权限,无需安装sudo,统一安装依赖减少镜像层 RUN apt update && apt install -y \ unzip \ wget \ # Chrome运行必需的系统依赖,原有配置未安装全 libx11-6 \ libxcomposite1 \ libxdamage1 \ libxext6 \ libxfixes3 \ libxrandr2 \ libgbm1 \ libgtk-3-0 \ libasound2 \ libnss3 \ libxss1 \ fonts-liberation \ xdg-utils \ # wkhtmltopdf依赖 libxrender1 \ libfontconfig1 \ && rm -rf /var/lib/apt/lists/* # 安装wkhtmltopdf RUN wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.focal_amd64.deb \ && apt install -y ./wkhtmltox_0.12.6-1.focal_amd64.deb \ && rm wkhtmltox_0.12.6-1.focal_amd64.deb # 提前同意字体安装协议,避免构建时交互卡住 RUN echo "ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true" | debconf-set-selections \ && apt install -y ttf-mscorefonts-installer # 安装Chrome,加-f参数自动补全缺失依赖 RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \ && apt install -y -f ./google-chrome-stable_current_amd64.deb \ && rm google-chrome-stable_current_amd64.deb # 准备目录、下载驱动,给可执行权限 RUN mkdir -p /driver /userprofile && chmod 777 /userprofile RUN wget -q --continue -P /driver https://chromedriver.storage.googleapis.com/103.0.5060.53/chromedriver_linux64.zip \ && unzip /driver/chromedriver_linux64.zip -d /driver \ && chmod +x /driver/chromedriver \ && rm /driver/chromedriver_linux64.zip ENV PATH=$PATH:/driver WORKDIR /app COPY --from=build /app/src/WebJobPDF/publish ./ ENTRYPOINT ["./WebJobPDF"]
3. C# 代码修正
修正错误的路径配置,补全稳定性参数,增加异常容错:
ChromeOptions options = new ChromeOptions(); if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { // 正确指定Chrome二进制路径 options.BinaryLocation = "/usr/bin/google-chrome-stable"; // 新版Chrome使用--headless=new参数,兼容性更好 options.AddArgument("--headless=new"); options.AddArgument("--no-sandbox"); options.AddArgument("--disable-setuid-sandbox"); options.AddArgument("--disable-dev-shm-usage"); options.AddArgument("--disable-gpu"); options.AddArgument("--user-data-dir=/userprofile"); // 新增稳定性参数 options.AddArgument("--disable-software-rasterizer"); options.AddArgument("--no-first-run"); options.AddArgument("--no-default-browser-check"); options.AddArgument("--disable-extensions"); options.AddArgument("--disable-features=Translate"); // 启动时直接指定窗口大小,无需启动后再修改 options.AddArgument("--window-size=1920,1080"); // 删除不必要的远程调试端口配置,避免多实例端口冲突 // options.AddArgument("--remote-debugging-port=9222"); } else { options.AddArgument("--headless"); } // 显式指定chromedriver路径,避免驱动查找失败 using (var driver = new ChromeDriver("/driver", options)) { driver.Navigate().GoToUrl(url); driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(30); driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(15); Int64 pageHeight = (Int64)driver.ExecuteScript("return document.body.scrollHeight"); for (int i = 0; i < pageHeight; i += 100) { driver.ExecuteScript($"window.scrollBy(0, 100)"); // 滚动时加短延迟,等待懒加载内容渲染 Thread.Sleep(50); } // 增加元素存在判断,避免找不到元素时JS报错 driver.ExecuteScript("if(document.getElementsByTagName('header')[0]){document.getElementsByTagName('header')[0].remove();}"); await Task.Delay(2000); driver.ExecuteScript("if(document.getElementsByTagName('footer')[0]){document.getElementsByTagName('footer')[0].remove();}"); await Task.Delay(2000); driver.ExecuteScript(@"if(document.querySelectorAll(""button[aria-label='Gerar PDF']"")[0]){document.querySelectorAll(""button[aria-label='Gerar PDF']"")[0].remove();}"); await Task.Delay(2000); driver.ExecuteScript(@"if(document.querySelectorAll(""div[role='alert']"")[0]){document.querySelectorAll(""div[role='alert']"")[0].remove();}"); result = driver.PageSource; }
额外注意事项
- Chrome和ChromeDriver的大版本必须完全匹配,你当前写死的103版本是2022年的旧版本,如果构建时拉取最新版Chrome会出现版本不兼容问题,建议要么固定Chrome安装版本和驱动对应,要么在构建时自动匹配对应版本的驱动。
- 容器中使用root权限运行Chrome时,
--no-sandbox参数为必填项,当前配置已包含该参数无需调整。 - Docker默认
/dev/shm共享内存大小仅64M,--disable-dev-shm-usage参数已配置,会使用磁盘作为临时内存,不会出现共享内存不足导致的崩溃问题。
内容的提问来源于stack exchange,提问作者Ricardo Gaefke
相关产品推荐
相关产品推荐

