.NET Core API Docker部署Selenium ChromeDriver启动失败求助
问题原因
你的Dockerfile采用分阶段构建,但第二阶段使用的mcr.microsoft.com/dotnet/aspnet:5.0镜像仅包含.NET运行时,没有Chrome浏览器和ChromeDriver,而第一阶段的selenium/standalone-chrome:latest镜像并未被实际复用,导致容器内缺少ChromeDriver运行所需的依赖环境,因此无法启动驱动服务。
解决方案
提供两种可行修复方案,选择其中一种即可:
方案一:基于Selenium镜像搭建.NET运行环境
修改Dockerfile,将.NET 5.0运行时安装到包含Chrome和ChromeDriver的Selenium镜像中,确保环境依赖完整:
# 第一阶段:构建.NET项目 FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build WORKDIR /src COPY ["Pand.csproj", "."] RUN dotnet restore "./Pand.csproj" COPY . . WORKDIR "/src/." RUN dotnet build "Pand.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "Pand.csproj" -c Release -o /app/publish /p:UseAppHost=false # 第二阶段:基于Selenium镜像部署,安装.NET运行时 FROM selenium/standalone-chrome:latest AS final WORKDIR /app # 安装.NET 5.0运行时 RUN wget https://dot.net/v1/dotnet-install.sh && \ chmod +x dotnet-install.sh && \ ./dotnet-install.sh --version 5.0.17 --install-dir /usr/share/dotnet && \ ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet # 复制发布的项目文件 COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "Pand.dll"]
方案二:在.NET镜像中安装Chrome和ChromeDriver
如果更倾向于以.NET镜像为基础,可以手动安装Chrome浏览器和对应版本的ChromeDriver:
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base WORKDIR /app # 安装Chrome浏览器和ChromeDriver RUN apt-get update && \ apt-get install -y wget unzip gnupg2 && \ wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list && \ apt-get update && \ apt-get install -y google-chrome-stable && \ CHROME_DRIVER_VERSION=$(curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE) && \ wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip && \ unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/ && \ rm /tmp/chromedriver.zip && \ chmod +x /usr/local/bin/chromedriver # 复制发布的项目文件 COPY bin/Release/net5.0/publish/ app/ WORKDIR /app ENTRYPOINT ["dotnet", "Pand.dll"]
额外优化建议
- 初始化ChromeDriver时,建议指定ChromeDriver的路径(方案二中安装路径为
/usr/local/bin/chromedriver),同时添加内存优化参数:
ChromeOptions options = new ChromeOptions(); options.AddArgument("no-sandbox"); options.AddArgument("headless"); options.AddArgument("disable-dev-shm-usage"); // 解决容器共享内存不足问题 // 指定ChromeDriver路径 driver = new ChromeDriver("/usr/local/bin", options);
- 运行容器时,添加共享内存参数避免Chrome崩溃:
docker run -p 8080:80 --shm-size=2g pand/backend
内容的提问来源于stack exchange,提问作者Sasan
相关产品推荐
相关产品推荐

