如何在Docker容器中运行集成Selenium WebDriver的.NET 6控制台应用
我希望在Docker容器中运行Selenium WebDriver,并在C#编写的.NET控制台应用中调用它。
我的Dockerfile如下:
FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["Bot/Bot.csproj", "Bot/"] RUN dotnet restore "Bot/Bot.csproj" COPY . . WORKDIR "/src/Bot" RUN dotnet build "Bot.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "Bot.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "Bot.dll"]
控制台应用Program.cs代码:
using OpenQA.Selenium.Chrome; Console.WriteLine("Hello, World!"); var driver = new ChromeDriver(); Console.ReadLine();
该应用基于.NET 6.0,使用Linux容器,打算在树莓派上运行。当前运行容器时,实例化ChromeDriver出现异常:
OpenQA.Selenium.WebDriverException: 'Cannot start the driver service on http://localhost:43407/'
我猜测容器未安装Chrome,但不知如何添加,也不确定这是否是唯一问题。已安装Selenium.Support和Selenium.WebDriver.ChromeDriver NuGet包,且已将chromedriver复制到bin/Debug/net6.0文件夹中。请问需要做哪些操作才能让WebDriver在容器中正常运行?
你的猜测正确,容器缺少Chrome浏览器及适配的运行环境,再加上树莓派是ARM64架构,需要针对性调整镜像和配置,以下是完整步骤:
1. 修改Dockerfile,添加Chrome及依赖
使用支持ARM64的基础镜像,并安装适配架构的Chrome浏览器,修改后的Dockerfile如下:
# 选用支持ARM64的.NET 6 runtime基础镜像 FROM mcr.microsoft.com/dotnet/runtime:6.0-bullseye-slim AS base WORKDIR /app # 安装Chrome浏览器及依赖(适配ARM64) RUN apt-get update && apt-get install -y \ wget \ gnupg2 \ && wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \ && echo "deb [arch=arm64] 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 \ && rm -rf /var/lib/apt/lists/* EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim AS build WORKDIR /src COPY ["Bot/Bot.csproj", "Bot/"] RUN dotnet restore "Bot/Bot.csproj" COPY . . WORKDIR "/src/Bot" RUN dotnet build "Bot.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "Bot.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . # 确保ChromeDriver在系统路径中 ENV PATH="$PATH:/app" ENTRYPOINT ["dotnet", "Bot.dll"]
2. 调整C#代码的ChromeDriver配置
容器无图形界面,必须启用无头模式,同时添加容器环境必需的启动参数:
using OpenQA.Selenium.Chrome; Console.WriteLine("Hello, World!"); var options = new ChromeOptions(); // 启用无头模式(适配容器无界面环境) options.AddArgument("--headless=new"); // 禁用沙箱(容器环境下必须) options.AddArgument("--no-sandbox"); // 禁用/dev/shm使用,避免内存不足问题 options.AddArgument("--disable-dev-shm-usage"); // 指定容器中Chrome的二进制文件路径 options.BinaryLocation = "/usr/bin/google-chrome-stable"; var driver = new ChromeDriver(options); try { // 示例:访问测试网页 driver.Navigate().GoToUrl("https://www.example.com"); Console.WriteLine("页面标题:" + driver.Title); } finally { driver.Quit(); } Console.ReadLine();
3. 确保Chrome与ChromeDriver版本匹配
执行google-chrome --version查看容器中Chrome的版本,安装完全对应版本的Selenium.WebDriver.ChromeDriver NuGet包,版本不匹配会直接导致启动失败。
4. 构建并运行容器
适配ARM64架构构建镜像:
docker build --platform linux/arm64 -t selenium-bot .
运行容器:
docker run --rm selenium-bot
内容的提问来源于stack exchange,提问作者mark_h

