c# - 如何在 Docker 中使用 Selenium 运行 dotnet core 应用程序
问题描述
我在 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.141
到Selenium.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 并将其用作下一步的基本映像吗?
解决方案
所以我最近遇到了同样的问题。
TL;博士; 您必须通过将命令放入 Docker 文件中来将 chrome 安装到 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 中为具有 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
推荐阅读
- c++ - 即使设置为 MTd,项目也使用 MDd 编译
- javascript - 为什么这个功能没有运行?
- konvajs - Konva.js 在 Rect 元素周围挥动笔划
- ios - UINavigationController: Pop ViewController 动画暂停一会
- twitter-bootstrap - 使用 Bootstrap 包含模态
- javascript - 窗口较小或在移动设备上时的响应式标题 - 要有创意
- flutter - onHover: (something) => function(context) 和 onHover: function(context) 在颤振中有什么区别?
- dji-sdk - DJI M210可以使用哪个仿真环境
- python - 无法导入烧瓶pycharm
- wordpress - Wordpress 媒体库 - 上传是灰色的