如何将已发布.NET Core Web API与selenium/standalone-chrome合并为单个Docker容器
问题根源
你当前的多阶段构建仅拷贝了发布后的应用文件,未将.NET运行时同步到最终镜像中:selenium/standalone-chrome 镜像本身未预装ASP.NET 3.1运行时,因此系统找不到dotnet命令。
可行方案
两种方案均不会将dotnet publish步骤写入Dockerfile,符合你的基础设施限制要求。
方案1:使用自包含发布(推荐,无需修改镜像层)
你已经指定了linux-x64运行时标识,只需在发布时开启自包含选项,把.NET运行时一起打包到发布产物中,不需要依赖镜像预装dotnet:
- 调整本地发布命令:
dotnet publish WebApi.csproj -c Release -o out_linux -r linux-x64 --self-contained true
- 修改Dockerfile,无需多阶段构建:
FROM selenium/standalone-chrome WORKDIR /app COPY . ./ # 自包含发布后可直接执行应用可执行文件,也可以用./dotnet调用dll ENTRYPOINT ["./MyProject.WebApi"] # 若需要保留dotnet调用方式可替换为:ENTRYPOINT ["./dotnet", "MyProject.WebApi.dll"]
方案2:在Selenium镜像内手动安装ASP.NET运行时
如果不想使用自包含发布,可以基于Selenium镜像手动安装对应版本的.NET运行时:
FROM selenium/standalone-chrome # 切换到root用户安装依赖 USER root RUN apt-get update && apt-get install -y wget apt-transport-https \ && wget https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \ && dpkg -i packages-microsoft-prod.deb \ && apt-get update \ && apt-get install -y aspnetcore-runtime-3.1 \ && rm -rf /var/lib/apt/lists/* packages-microsoft-prod.deb # 切回Selenium默认用户避免权限异常 USER 1200 WORKDIR /app COPY . ./ ENTRYPOINT ["dotnet", "MyProject.WebApi.dll"]
注意事项
- 容器内运行Selenium Chrome时,需要添加启动参数
--no-sandbox --disable-dev-shm-usage避免权限不足报错 - 若使用方案2且Selenium镜像基于更高版本Debian,只需将微软源地址中
debian/10替换为对应系统版本号即可
内容的提问来源于stack exchange,提问作者MicMit
相关产品推荐
相关产品推荐

