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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:50:33