如何在Docker中使用Selenium运行dotnet核心应用

时间:2019-03-17 10:44:19

标签: c# selenium docker .net-core selenium-chromedriver

我在Docker容器中运行了dotnet core 2.2(aspnet核心)应用程序。我正在使用在任何基本教程中都可以找到的最简单的Dockerfile:

  • 使用microsoft/dotnet:2.2-sdk作为基本图片
  • 复制* .csproj
  • 还原软件包
  • 构建
  • 发布到/ app文件夹
  • 使用microsoft/dotnet:2.2.1-aspnetcore-runtime从/ app文件夹运行应用程序

现在,我想从另一个网站获取一些数据。这是SPA,因此我需要首先使用浏览器来呈现页面-我决定将Selenium与ChromeDriver一起使用,因为我已经对它们有点熟悉了。

我已将Selenium.WebDriver v3.141Selenium.WebDriver.ChromeDriver v73.0添加到我的项目中,在此处设置Selenium。在Windows上本地运行正常。但是当我通过Docker运行时,我得到了:

The file /app/chromedriver does not exist. The driver can be downloaded at http://chromedriver.storage.googleapis.com/index.html

所以现在我想知道如何在Docker中使用dotnet core 2.2运行Selenium +单实例Chrome(不需要为我的目的设置Selenium Grid)。

我想我需要创建自定义Dockerfile,该文件:

  • 安装硒,chrome及其所有依赖项
  • 安装dotnet
  • 与我当前的Dockerfile相同,以构建和运行我的应用

但是我不太确定该怎么做。特别是如何“嵌套” Dockerfile。 我应该在单个Dockerfile中进行这种组合吗?我应该为Selenium + ChromeDriver创建Dockerfile并将其用作下一步的基础映像吗?

2 个答案:

答案 0 :(得分:1)

所以我最近遇到了同样的问题。

  

TL; DR;您必须通过将chrome安装到docker映像中   Docker文件中的命令。

 FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch

 # Install Chrome
 RUN apt-get update && apt-get install -y \
 apt-transport-https \
 ca-certificates \
 curl \
 gnupg \
 hicolor-icon-theme \
 libcanberra-gtk* \
 libgl1-mesa-dri \
 libgl1-mesa-glx \
 libpango1.0-0 \
 libpulse0 \
 libv4l-0 \
 fonts-symbola \
 --no-install-recommends \
 && curl -sSL 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 \
 --no-install-recommends \
 && apt-get purge --auto-remove -y curl \
 && rm -rf /var/lib/apt/lists/*

 # Add your dotnet core project build stuff here
  

更简单的解决方案-我在Docker Hub仓库中将其作为Docker映像推送了,因此您可以将其用作基础映像。参见我的dotnet core 2.2的示例

 FROM masteroleary/selenium-dotnetcore2.2-linux:v2 AS base

 WORKDIR /app

 EXPOSE 80

 EXPOSE 443

 FROM masteroleary/selenium-dotnetcore2.2-linux:v2 AS build WORKDIR /src

 COPY ["MyProject.csproj", ""]

 RUN dotnet restore "MyProject.csproj"

 COPY . .

 WORKDIR "/src/"

 RUN dotnet build "MyProject.csproj" -c Prod -o /app

 FROM build AS publish

 RUN dotnet publish "MyProject.csproj" -c Prod -o /app

 FROM base AS final

 WORKDIR /app

 COPY --from=publish /app .

 ENTRYPOINT ["dotnet", "MyProject.dll"]
  

这是怎么发生的?

基本上在visual Studio中为具有docker支持的dotnet core 2.2 mvc创建了一个新项目。

意图是在Linux容器中运行我的dotnet核心应用

假设通过安装nuget软件包Selenium.Support,Selenium.WebDriver,Selenium.WebDriver.ChromeDriver,我需要的任何东西都会自动包含在Docker容器中,因为Selenium.WebDriver支持.NetStandard 2.0(其他情况不支持意识到)

原来,您必须通过将命令放入Docker文件中,将chrome安装到docker映像中。

我已经在此处说明了整个学习过程,包括如何找到此有效代码:https://hub.docker.com/r/masteroleary/selenium-dotnetcore2.2-linux

答案 1 :(得分:1)

由于自包含应用程序出现在dotnet核心中,所以我认为更好的方法是使用官方的Selenium泊坞窗: https://hub.docker.com/r/selenium/standalone-chrome 并构建自包含的应用程序。 这是我的dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 as build-env
WORKDIR /app

COPY . ./
RUN dotnet publish MyApp.csproj -c Release -o out --self-contained -r linux-x64 /p:PublishTrimmed=true

FROM selenium/standalone-chrome
WORKDIR /app

COPY --from=build-env /app/out .

ENTRYPOINT ["./MyApp"]