.NET Selenium项目在WSL2 Docker容器运行报Cannot assign requested address错误求助
问题解决方向
1 修复Dockerfile依赖安装逻辑
你当前的依赖安装全部写在了build阶段,而最终运行程序的final阶段使用的是纯净的dotnet runtime镜像,完全没有Chrome运行所需的依赖,同时安装Chrome前没有添加官方源也会导致Chrome安装失败,这是触发libgobject-2.0.so.0缺失报错的核心原因。
需要将Chrome及依赖的安装逻辑挪到base阶段(final阶段的基础镜像),同时补全所有Chrome运行必备的依赖包,修正后的Dockerfile参考如下:
FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base WORKDIR /app # 安装Chrome及运行所需全量依赖 RUN apt-get update && apt-get install -y \ wget \ gnupg2 \ apt-transport-https \ && wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \ && echo "deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list \ && apt-get update && apt-get install -y \ google-chrome-stable \ libglib2.0-0 \ libnss3 \ libnspr4 \ libdbus-1-3 \ libatk1.0-0 \ libatk-bridge2.0-0 \ libcups2 \ libdrm2 \ libxcb1 \ libxkbcommon0 \ libatspi2.0-0 \ libx11-6 \ libxcomposite1 \ libxdamage1 \ libxext6 \ libxfixes3 \ libxrandr2 \ libgbm1 \ libpango-1.0-0 \ libcairo2 \ libasound2 \ && rm -rf /var/lib/apt/lists/* FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["ConsoleApp1/ConsoleApp1.csproj", "ConsoleApp1/"] RUN dotnet restore "ConsoleApp1/ConsoleApp1.csproj" COPY . . WORKDIR "/src/ConsoleApp1" RUN dotnet build "ConsoleApp1.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "ConsoleApp1.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "ConsoleApp1.dll"]
2 修正Chrome启动参数
Cannot assign requested address [::1]:39307报错是因为Chrome默认尝试绑定ipv6的本地回环地址,多数容器环境默认未开启ipv6支持,同时容器内默认缺少沙箱权限,需要补充对应的启动参数适配容器环境。
修正后的代码参考如下:
using OpenQA.Selenium.Chrome; namespace IntroSelenium { class Program { static void Main(string[] args) { var chromeOptions = new ChromeOptions(); chromeOptions.AddArguments("headless=new"); // 新版无头模式兼容性更好 chromeOptions.AddArguments("--no-sandbox"); // 容器环境必须关闭沙箱 chromeOptions.AddArguments("--disable-dev-shm-usage"); // 避免容器共享内存不足 chromeOptions.AddArguments("--disable-ipv6"); // 禁用ipv6解决地址绑定错误 chromeOptions.AddArguments("--remote-debugging-address=0.0.0.0"); // 允许所有网卡访问调试端口 // 指定系统安装的Chrome路径,避免Selenium查找失败 chromeOptions.BinaryLocation = "/usr/bin/google-chrome-stable"; using (ChromeDriver driver = new ChromeDriver(chromeOptions)) { // 业务逻辑 } } } }
额外注意:你使用的Selenium.WebDriver.ChromeDriver Nuget包版本需要和容器内安装的google-chrome-stable大版本保持一致,否则会出现兼容性报错。
3 WSL2 Docker可选检查
如果修改完上述两项仍有端口绑定问题,可以检查Docker Desktop的ipv6配置,不需要使用ipv6的话保持默认关闭即可,配合代码中的--disable-ipv6参数即可正常运行。
内容的提问来源于stack exchange,提问作者sumale_mambo
相关产品推荐
相关产品推荐

