我在Docker容器中运行了dotnet core 2.2(aspnet核心)应用程序。我正在使用在任何基本教程中都可以找到的最简单的Dockerfile:
microsoft/dotnet:2.2-sdk
作为基本图片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,该文件:
dotnet
但是我不太确定该怎么做。特别是如何“嵌套” Dockerfile。 我应该在单个Dockerfile中进行这种组合吗?我应该为Selenium + ChromeDriver创建Dockerfile并将其用作下一步的基础映像吗?
答案 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"]