【问题标题】:How to run dotnet core app with Selenium in Docker如何在 Docker 中使用 Selenium 运行 dotnet core 应用程序
【发布时间】:2019-08-07 22:11:25
【问题描述】:

我在 Docker 容器中运行了 dotnet core 2.2 (aspnet core) 应用程序。我正在使用您在任何基本教程中都可以找到的最简单的 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:

  • 安装 selenium、chrome 及其所有依赖项
  • 安装dotnet
  • 与我当前的 Dockerfile 一样来构建和运行我的应用程序

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

【问题讨论】:

  • 你有想过这个吗?
  • @masteroleary 不幸的是,没有。我改用 Puppeteer(无头 Chrome)。特别是 this 用于在本地运行,this 用于在 AWS Lambda 中运行
  • 如果我的回答对你来说不是一个完整的解决方案,请告诉我,我会调整它。我自己刚刚经历了两天。

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


【解决方案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 镜像推送到我的 docker hub 存储库中,以便您可以将其用作基础镜像。请参阅我的 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中为dotnet core 2.2 mvc创建了一个新项目,支持docker。

意图是在 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

【讨论】:

  • 嗨@masteroleary。您的 dockerfile 正在为我工​​作。现在,我想与 Firefox (GeckoDriver) 一起使用。希望你能帮忙。谢谢~
【解决方案2】:

由于在dotnet core中出现了自包含应用程序,我认为更好的方法是使用官方的selenium docker: 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"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2019-05-16
    • 2022-11-23
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多