具备Docker支持的Blazor WebAssembly应用(Linux)

15

今天我有一个问题,这是那种你总是想知道但又害怕问的问题;) 但这个问题也与BlazorWebAssembly应用程序的Docker支持相关。所以我可能会描述一下我做了什么。

所以我想玩一下尖端的Blazor技术,当然还有.NET 5.0(我的最后一个“尖端技术”是ASP.NET MVC - 所以是的,已经有一段时间了:))

起初我并不太清楚Blazor相关选项的含义。所以我选择了:

enter image description here

你可以看到,“启用Docker支持”选项被禁用了。所以就像“Docker支持问题预览”:)

我不知道“ASP.NET Core托管”选项代表什么,所以我没有使用它(这是个错误)。一旦你勾选了这个选项,它将创建一个服务器应用程序,一个客户端(Blazor),一个共享项目(用于模型之间的目的)

我不知道这一点,所以我必须自己添加WebApi项目和一些模型项目:)

现在,下一步是添加Docker支持(出乎意料地可能)

enter image description here

这将创建一个Docker文件:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ["BlazorApp/BlazorApp.csproj", "BlazorApp/"]
COPY ["../SearchMovies.Model/SearchMovies.Model.csproj", "../SearchMovies.Model/"]
RUN dotnet restore "BlazorApp/BlazorApp.csproj"
COPY . .
WORKDIR "/src/BlazorApp"
RUN dotnet build "BlazorApp.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "BlazorApp.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "BlazorApp.dll"]

启动该应用程序将以类似以下内容的方式结束:

docker exec -i -e ASPNETCORE_HTTPS_PORT="32776" -w "/app" 28d444a42ceefdf124b29f9f542f423aa931e521d077bbfeb19e5da7644a5e25 sh -c ""dotnet" --additionalProbingPath /root/.nuget/fallbackpackages2 --additionalProbingPath /root/.nuget/fallbackpackages --additionalProbingPath /root/.nuget/fallbackpackages3  \"/app/bin/Debug/net5.0/BlazorApp.dll\" | tee /dev/console"
Cannot use file stream for [/app/bin/Debug/net5.0/BlazorApp.deps.json]: No such file or directory
A fatal error was encountered. The library 'libhostpolicy.so' required to execute the application was not found in '/app/bin/Debug/net5.0/'.
Failed to run as a self-contained app.
  - The application was run as a self-contained app because '/app/bin/Debug/net5.0/BlazorApp.runtimeconfig.json' was not found.
  - If this should be a framework-dependent app, add the '/app/bin/Debug/net5.0/BlazorApp.runtimeconfig.json' file and specify the appropriate framework.

我已经谷歌过了,答案是:没错,这是正常的行为。Blazor只是一些静态文件(只是“聪明地”生成),所以它不能工作。说实话,我听到他们的话,但是...为什么

我谷歌了一下,找到了一篇关于Blazor Webassembly的好文章:

https://medium.com/@waelkdouh/hosting-containerized-client-side-blazor-applications-on-azure-e090af738619

文章开头有趣的事实(引用自文章):

注意:我想象这个复选框将在未来某个时候启用

所以,伙计们,只是为了使你们平静。我们绝对不在未来 :)

所以我改变了docker文件。如果我记得正确的话 - 像文章中那样“手动”运行它,使用“docker build”和“docker run”它成功启动。

但是当试图点击“调试”(或开始无调试)时,错误与先前相同。这里是建议使用的Docker文件(我仅更改了版本为5.0,并更改了发布仅在项目上运行):

FROM mcr.microsoft.com/dotnet/core/sdk:5.0-buster-slim AS build-env
WORKDIR /app
COPY . ./
RUN dotnet publish "BlazorApp/BlazorApp.csproj" -c Release -o output

FROM nginx:alpine
WORKDIR /var/www/web
COPY --from=build-env /app/output/wwwroot .
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

所以尝试了两种方法。我还看了另一个先进的编排工具,叫做tye

https://devblogs.microsoft.com/aspnet/introducing-project-tye/

但它不能很好地处理 Blazor。

我甚至快速创建了一个带有 ASP.NET Core 托管选项的 Blazor 应用程序。在 tye inittye buildtye run 之后,客户端项目没有任何绑定:

enter image description here

所以也许有人有一些想法,我可以尝试什么呢?

而且最初提到的问题是关于编排的。假设我在解决方案中有四个项目——例如,Blazor 和三个 webapi。如何运行所有东西,使它自动绑定端点。因为通常我必须添加端点的 URL,例如:“https://localhost:5123/api/SomeService”

当启动 docker 时,它至少可以为那些 API 分配不同的端口号。在代码中手动更改似乎是愚蠢的事情。

在这种情况下,最好的解决方法是什么——当端点之间有很多通信时,我想启动它们所有并且它们将自动“连接”(即,它们将知道“其他”服务在哪个端口)?

提前感谢对这两个问题的回答。


1
澄清问题:为什么您想要在像Blazor Wasm这样的静态网站中使用Docker?这应该解决哪个问题? - Akinzekeel
1
为了测试,你需要一些url。请纠正我,但我认为Docker不会通过HTTP神奇地开始提供静态文件。你需要的是一个Web服务器(你可以使用Asp.Net Core托管选项得到它)。 - Akinzekeel
1
Docker并不会像魔术一样自动完成所有事情。它只会按照dockerfile中的命令执行 :) 我所抱怨的是:“添加docker支持”对于Blazor并没有做得很好(因为正如我链接的文章中所描述的那样,你只需构建它并将输出复制到将托管在NGINX中的文件夹中即可)。但是,正如我所说,即使我将其定义为这样 - 它仍然无法构建(启动而不进行调试)。最重要的是,我选择了“Asp.net core hosted”选项,但这次docker支持仍然无法工作(无法启动)。 - Piotr
希望你不要尝试从命令行运行wasm应用程序 - 因为它不受支持(你需要一个浏览器)https://github.com/dotnet/aspnetcore/issues/29956 - Dmitry Pavlov
Chris Sainty在这个主题上有一篇不错的博客文章:https://chrissainty.com/containerising-blazor-applications-with-docker-containerising-a-blazor-webassembly-app/ - Alberto Guerrero
显示剩余2条评论
1个回答

1
你可以使用Docker Compose来管理多个应用程序。 YAML文件docker-compose.yml将为每个应用程序引用Dockerfile
version: '3.4'

services:
  webfrontend:
    image: ${DOCKER_REGISTRY-}webfrontend
    build:
      context: .
      dockerfile: WebFrontEnd/Dockerfile

  mywebapi:
    image: ${DOCKER_REGISTRY-}mywebapi
    build:
      context: .
      dockerfile: MyWebAPI/Dockerfile

看起来应该可以工作,但实际上并没有。如果你将前端作为一个纯粹的Docker容器运行,它会启动并响应。但是如果你使用docker-compose,它会报错:"遇到了致命错误。执行应用程序所需的库'libhostpolicy.so'在'/app/bin/Debug/net5.0/'中未找到。无法作为自包含应用程序运行。" - Kinetic
1
似乎在这个领域存在问题:https://github.com/dotnet/aspnetcore/issues/21828 - Kinetic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接