首页 > 解决方案 > 在 Docker 上运行 Asp Core MVC - 未加载静态文件/wwwroot 文件

问题描述

当我启动容器时,页面开始时没有样式、脚本、图像和其他静态文件 - 调用加载它们返回 404。

我想说的是,当我访问app文件夹时,wwwroot文件夹是存在的。

我在我的 Release 文件夹中测试了它(使用 dotnet 命令)。但在 Docker 中它不起作用。是的,我UseStaticFiles在我的 Startup 课程中使用。

我的 Dockerfile 很简单,它只是运行应用程序。但是我之前构建并发布了该应用程序,并且 wwwroot 就在那里。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
EXPOSE 80
EXPOSE 443

COPY bin/Release app/

ENTRYPOINT ["dotnet", "app/MyApp.SGC.Site.dll"]

wwwroot 存在

应用程序运行,但有很多错误:

错误

有人能帮我吗?

标签: c#docker.net-coredockerfile

解决方案


您必须运行该dotnet publish命令,以便将所有必需的文件复制到您的应用程序文件夹中。

您的发布文件夹仅包含应用程序的 dll 文件,因此当您将其复制到 docker 容器中时wwwroot,不会复制文件。

如果您创建一个新的 Web 应用程序项目并勾选 Docker 支持选项,它将为您创建一个 dockerfile。创建一个示例项目,以便您可以看到容器化应用程序的推荐方法。

这是一个使用发布命令的示例:

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

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["MyApp.SGC.Site/MyApp.SGC.Site.csproj", "MyApp.SGC.Site/"]
RUN dotnet restore "MyApp.SGC.Site/MyApp.SGC.Site.csproj"
COPY . .
WORKDIR "/src/MyApp.SGC.Site"
RUN dotnet build "MyApp.SGC.Site.csproj" -c Release -o /app/build

FROM build AS publish
# publish will copy wwwroot files as well
RUN dotnet publish "MyApp.SGC.Site.csproj" -c Release -o /app/publish
WORKDIR /app/publish

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

推荐阅读