支持 docker 的 Blazor WebAssembly 应用程序 (linux)

Posted

技术标签:

【中文标题】支持 docker 的 Blazor WebAssembly 应用程序 (linux)【英文标题】:Blazor WebAssembly App with docker support (linux) 【发布时间】:2021-02-25 22:38:15 【问题描述】:

今天我有一个问题,这是您一直想知道但总是害怕问的问题之一;)但是这个问题也与 BlazorWebAssembly 应用程序 docker 支持相关。所以也许我会描述一下我做了什么。

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

一开始我不太清楚与 Blazor 相关的那些选项的用途。所以我选择了:

您可以发现,“启用 Docker 支持”选项是灰色的。所以就像“码头工人支持问题预览”:)

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

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

现在,下一步是添加 docker 支持(令人惊讶的是这是可能的)

这创建了一个 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 只是一个静态文件(它只是“智能”生成的)所以这就是它不起作用的原因。 Tbh,我听到了,但仍然……为什么?为什么?

我用谷歌搜索了一下。我在这里找到了一些关于 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 之后,客户端项目没有绑定:

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

我想一开始提到的问题是关于编排的。假设我在解决方案中有四个项目 - 例如,Blazor 和三个 webapi`s。如何运行所有内容,以便自动绑定端点。因为通常我必须为端点添加 url,例如:“https://localhost:5123/api/SomeService”

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

解决这种情况的最佳方法是什么 - 端点之间有很多通信,我想启动所有这些,它们将自动“连接”(意思是,他们将知道“其他”在哪个端口上" 服务是)?

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

【问题讨论】:

澄清问题:为什么要将 Docker 用于像 Blazor Wasm 这样的静态网站?这应该解决哪个问题? 本地测试更改的问题(就像您放入 docker 中的所有内容一样)您有一些正在开发的代码,并且想要对其进行测试。为了测试你需要一些 url(无论是动态网站还是静态网站) "为了测试你需要一些 url" 如果我​​错了,请纠正我,但我认为 Docker 不会神奇地开始通过 HTTP 提供静态文件。您需要的是一个 Web 服务器(您可以通过 Asp.Net Core 托管选项获得) Docker 几乎没有做任何神奇的事情。它执行您在 dockerfile 中命令他执行的操作 :) 我抱怨的是:“添加 docker 支持”对 Blazor 不正确(因为如我链接的文章中所述 - 您可以构建它并将输出复制到将托管在 NGINX 中的文件夹)但正如我所说,即使我这样定义它 - 它仍然不会构建(不调试就开始)而且最重要的是,我选择了选项“ Asp.net core hosts”这一次,docker 支持仍然不起作用(不会启动) 希望您不要尝试从命令行运行 wasm 应用程序 - 因为它不受支持(您需要浏览器)github.com/dotnet/aspnetcore/issues/29956 【参考方案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,它会爆炸并抱怨:“遇到致命错误。在 '/app/bin/Debug/net5.0/' 中找不到执行应用程序所需的库 'libhostpolicy.so'。失败作为一个独立的应用程序运行。” 好像这方面有问题:github.com/dotnet/aspnetcore/issues/21828

以上是关于支持 docker 的 Blazor WebAssembly 应用程序 (linux)的主要内容,如果未能解决你的问题,请参考以下文章

支持 docker 的 Blazor WebAssembly 应用程序 (linux)

具有本机依赖关系的 Blazor .NET 6 无法构建为 Docker 映像

添加第二个 EF 核心数据库后 Blazor 服务器端 docker 容器分段错误

Blazor Hybrid / MAUI 简介和实战

ServiceStack:添加 Blazor 支持?

如何向服务器端 Blazor 项目添加控制器(而非视图)支持