xol*_*ola 4 docker kubernetes .net-core asp.net-core wwwroot
只是玩了一下。我得到了一个包含 3 个项目的 Visual Studio 解决方案。这三个都需要。一个项目(“一个”)是应用程序的 UI。当然,它包含 wwwroot 中的静态文件。
我想对应用程序进行 dockerize。这里的 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"]
Run Code Online (Sandbox Code Playgroud)
是的,我正在使用 UseStaticFiles:
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"]
Run Code Online (Sandbox Code Playgroud)
并且静态文件(大部分)都以正确的大小写敏感度访问。但正如我已经说过的,没有任何静态文件可以访问。
在视图中,我的应用程序包含如下 CSS 文件:
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();
...
Run Code Online (Sandbox Code Playgroud)
虽然在 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">
...
Run Code Online (Sandbox Code Playgroud)
看到丢失的波浪号 ~ ?
如何将静态文件包含到 docker 镜像中?
谢谢!索拉
好吧,现在我发现了自己。
错误出在 Dockerfile 本身。我需要明确说明要构建哪个 csproj 文件以及要发布哪个文件。这是我在这里学到的。
实际上,不需要在 csproj 文件中定义诸如“包含此文件和此目录”之类的内容。
重要的是要说 wwwroot 目录没有编译到 dll 中。它存在于容器中的 /app 文件夹内(我在任何地方都找不到该信息,但我在这里得到了一个提示)。
这也提供了将外部文件夹映射到容器的能力(因此您可以编辑静态文件而无需一遍又一遍地重新 dockerize - 当然这不适用于生产环境)。
同样重要的是,对于生产环境和通常对于您不想进入映像的所有静态文件(如源 SCSS、未混淆的JS、临时文件、文件副本的备份副本等) on),应使用 .dockerignore 文件。
如果不这样做,静态文件可以通过浏览器直接访问,因为它们直接进入 wwwroot 目录。
所以这是我的工作 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 all.sln ./ # not sure if I need this
COPY one/one.csproj one/
COPY two/two.csproj two/
COPY three/three.csproj three/
COPY . ./
RUN dotnet build "/src/one/one.csproj" -c Release -o /app
RUN dotnet build "/src/two/two.csproj" -c Release -o /app
RUN dotnet build "/src/three/three.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "/src/one/one.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "one.dll"]
Run Code Online (Sandbox Code Playgroud)
希望我的解释可以帮助其他人将来解决这个问题。
谢谢!索拉
归档时间: |
|
查看次数: |
4740 次 |
最近记录: |