.NET 8 API集成Selenium Chrome在Docker中运行失败求助
背景
基于C#开发的.NET 8后端API,其中使用OpenQA.Selenium.Chrome编写的爬虫脚本在本地通过dotnet run可正常运行,但部署到Docker容器后完全无法工作。
原Dockerfile结构
FROM mcr.microsoft.com/dotnet/sdk:8.0 as build WORKDIR "/src" COPY ["/Solution.Project1/Solution.Project1.csproj", "Solution.Project1/"] COPY ["/Solution.Project2/Solution.Project2.csproj", "Solution.Project2/"] COPY ["/Solution.Project3/Solution.Project3.csproj", "Solution.Project3/"] COPY ["/Solution.Project4/Solution.Project4.csproj", "Solution.Project4/"] RUN dotnet restore "Solution.Project1/Solution.Project1.csproj" -s https://api.nuget.org/v3/index.json COPY . . WORKDIR "/src/Solution.Project1" RUN dotnet build "Solution.Project1.csproj" -c Debug -o /app/build FROM build as publish RUN dotnet publish "Solution.Project1.csproj" -c Debug -o /app/publish ENTRYPOINT ["dotnet", "Solution.Project1.dll"]
无效的修改尝试
曾尝试在Dockerfile中加入以下内容,但无任何效果:
FROM selenium/standalone-chrome WORKDIR /app COPY --from=build-env /app/out . FROM base AS final WORKDIR /app COPY --from=publish /app/publish .
运行时错误信息
调用API相关方法时抛出如下异常:
OpenQA.Selenium.NoSuchDriverException: Unable to obtain chrome using Selenium Manager; 相关文档请参考官方错误说明
OpenQA.Selenium.WebDriverException: Error starting process: /app/selenium-manager/linux/selenium-manager --browser "chrome" --output json
OpenQA.Selenium.WebDriverException: Selenium Manager process exited abnormally with 65 code: /app/selenium-manager/linux/selenium-manager --browser "chrome" --output json
Standard Output >>
{
"logs": [
{
"level": "ERROR",
"timestamp": 1706129527,
"message": "error sending request for url (googlechromelabs.github.io提供的版本下载信息JSON文件): error trying to connect: dns error: failed to lookup address information: Name does not resolve"
}
],
"result": {
"code": 65,
"message": "error sending request for url (googlechromelabs.github.io提供的版本下载信息JSON文件): error trying to connect: dns error: failed to lookup address information: Name does not resolve",
"driver_path": "",
"browser_path": ""
}
}
<<
at OpenQA.Selenium.SeleniumManager.RunCommand(String fileName, String arguments)
单独有效的Selenium配置
单独使用以下Docker配置时,容器中能正常找到chromedriver文件:
FROM selenium/standalone-chrome:latest AS base1 RUN sudo apt-get install -y wget xvfb unzip # Set up the Chrome PPA -> (not sure if needed) RUN sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - RUN sudo su -c "echo 'deb http://dl.google.com/linux/chrome/deb/ stable main' >> /etc/apt/sources.list.d/google.list" # Update the package list RUN sudo apt-get update -y # Set up Chromedriver Environment variables and install chrome ENV CHROMEDRIVER_VERSION 114.0.5735.90 ENV CHROME_VERSION 114.0.5735.90-1 RUN wget --no-verbose -O /tmp/chrome.deb "https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_${CHROME_VERSION}_amd64.deb" RUN sudo apt install -y --allow-downgrades /tmp/chrome.deb RUN sudo rm /tmp/chrome.deb ENV CHROMEDRIVER_DIR /chromedriver RUN sudo mkdir $CHROMEDRIVER_DIR # Download and install Chromedriver RUN sudo wget -q --continue -P $CHROMEDRIVER_DIR "http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip" RUN sudo unzip $CHROMEDRIVER_DIR/chromedriver* -d $CHROMEDRIVER_DIR
需求
将上述Selenium配置与.NET应用的Docker配置结合后,原本有效的Selenium配置全部失效,不清楚原因,希望能通过单个Dockerfile解决该问题。
内容的提问来源于stack exchange,提问作者MorganeT

