只是玩了一下。
我得到了一个 Visual Studio 解决方案,包含 3 个项目。
这三个都是需要的。
一个项目(“一”)是应用程序的 UI。当然,它包含 wwwroot 中的静态文件。
我想对应用程序进行 docker 化。
Dockerfile 在这里可以工作。
然后我通过 Ubuntu 服务器上的 kubernetes 加载此映像。
这里没问题,容器正在运行并服务请求。
但它根本不提供静态文件。所有这些文件请求都会导致 404 HTTP 错误。该网站看起来像垃圾(但可以加载)。
所以我登录到容器并开始观察 /app 的内容。这里没有名为“wwwroot”的目录。也不是子目录。
我不确定 wwwroot 目录是否属于这里?或者该目录包含在应用程序的dll中?
经过大量搜索(还在 StackOverflow 上发现了一些有用的问题),我发现文件会自动包含在构建过程中。无需在 csproj 文件中单独定义它们。但如果我这样做,它会导致“包含重复文件”或类似的错误。
这是 Dockerfile:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY one/one.csproj one/
COPY two/two.csproj two/
COPY three/three.csproj three/
COPY . ./
WORKDIR "/src/one"
RUN dotnet build -c Release -o /app
WORKDIR "/src/two"
RUN dotnet build -c Release -o /app
WORKDIR "/src/three"
RUN dotnet build -c Release -o /app
FROM build AS publish
RUN dotnet publish -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "one.dll"]
是的,我正在使用 UseStaticFiles:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
// IMPORTANT: This session call MUST go before UseMvc()
app.UseSession();
app.UseStaticFiles();
...
并且静态文件(大部分)都是以正确的区分大小写进行访问的。但正如我已经说过的,none可以访问静态文件。
在视图中,我的应用程序包含如下 CSS 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="~/framework/1.css">
<link rel="stylesheet" href="~/framework/2.css" media="screen,projection">
...
在 docker 内运行时,会生成以下 HTML 输出:
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="/framework/1.css">
<link rel="stylesheet" href="/framework/2.css" media="screen,projection">
...
看到缺少的波形符 ~ 吗?
如何将静态文件包含到docker镜像中?
谢谢你!索拉