今天我有一个问题,这是那种你总是想知道但又害怕问的问题;) 但这个问题也与BlazorWebAssembly应用程序的Docker支持相关。所以我可能会描述一下我做了什么。
所以我想玩一下尖端的Blazor技术,当然还有.NET 5.0(我的最后一个“尖端技术”是ASP.NET MVC - 所以是的,已经有一段时间了:))
起初我并不太清楚Blazor相关选项的含义。所以我选择了:
你可以看到,“启用Docker支持”选项被禁用了。所以就像“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只是一些静态文件(只是“聪明地”生成),所以它不能工作。说实话,我听到他们的话,但是...为什么
我谷歌了一下,找到了一篇关于Blazor Webassembly的好文章:
文章开头有趣的事实(引用自文章):
注意:我想象这个复选框将在未来某个时候启用
所以,伙计们,只是为了使你们平静。我们绝对不在未来 :)
所以我改变了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 init
、tye build
和 tye run
之后,客户端项目没有任何绑定:
所以也许有人有一些想法,我可以尝试什么呢?
而且最初提到的问题是关于编排的。假设我在解决方案中有四个项目——例如,Blazor 和三个 webapi。如何运行所有东西,使它自动绑定端点。因为通常我必须添加端点的 URL,例如:“https://localhost:5123/api/SomeService”
当启动 docker 时,它至少可以为那些 API 分配不同的端口号。在代码中手动更改似乎是愚蠢的事情。
在这种情况下,最好的解决方法是什么——当端点之间有很多通信时,我想启动它们所有并且它们将自动“连接”(即,它们将知道“其他”服务在哪个端口)?
提前感谢对这两个问题的回答。
wasm
应用程序 - 因为它不受支持(你需要一个浏览器)https://github.com/dotnet/aspnetcore/issues/29956 - Dmitry Pavlov