Chrome Docker容器中Selenium出现SessionNotCreated异常求助
解决方案:Docker中.NET Selenium Chrome启动失败问题
问题核心
报错显示Chrome启动后异常退出,本质是容器无GUI环境下未启用Chrome无头模式,同时存在路径配置、权限或参数缺失问题。
具体修复步骤
1. 修正ChromeOptions配置
添加无头模式核心参数,修正Chrome二进制文件路径(selenium官方镜像中Chrome路径为/usr/bin/google-chrome-stable),补充防崩溃参数:
var chromeOptions = new ChromeOptions(); if (OperatingSystem.IsLinux()) { // 修正Chrome二进制文件路径 chromeOptions.BinaryLocation = "/usr/bin/google-chrome-stable"; } // 容器环境必须启用无头模式 chromeOptions.AddArgument("--headless=new"); chromeOptions.AddArgument("--disable-gpu"); chromeOptions.AddArgument("--disable-dev-shm-usage"); chromeOptions.AddArgument("--no-sandbox"); chromeOptions.AddArgument("--disable-search-engine-choice-screen"); // 补充稳定运行参数 chromeOptions.AddArgument("--remote-debugging-port=9222"); chromeOptions.AddArgument("--disable-extensions"); chromeOptions.AddArgument("--disable-popup-blocking"); _webDriver = new ChromeDriver(chromeOptions);
2. 调整Dockerfile权限与依赖
selenium镜像的app用户可能缺少部分系统依赖,临时切换root安装必要库后切回原用户:
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. FROM selenium/standalone-chrome:latest AS base USER root # 安装Chrome运行所需的系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 libgtk-3-0 libasound2 USER app WORKDIR /app FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["MyApp.csproj", "MyApp/"] RUN dotnet restore "./MyApp.csproj" COPY . . WORKDIR "/src/MyApp" RUN dotnet build "./MyApp.csproj" -c $BUILD_CONFIGURATION -o /app/build FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./MyApp.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=true --self-contained true -r linux-x64 FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["./MyApp"] EXPOSE 5000
3. 显式指定ChromeDriver路径(可选)
若镜像中ChromeDriver路径非默认,可显式指定避免版本不匹配:
var chromeDriverService = ChromeDriverService.CreateDefaultService(); // 指定镜像自带的ChromeDriver路径 chromeDriverService.Path = "/usr/bin/chromedriver"; _webDriver = new ChromeDriver(chromeDriverService, chromeOptions);
验证方式
构建并运行容器,查看日志确认无启动报错:
docker build -t myapp . docker run -p 5000:5000 myapp
内容的提问来源于stack exchange,提问作者Echarnus
相关产品推荐
相关产品推荐

