首页 > 解决方案 > Docker Asp.net 核心应用程序不会加载我的 JS、imgs

问题描述

我有一个发布时运行良好的 asp.net 核心应用程序。我正在使用以下一系列命令将它部署到 docker 映像中,从这个 MSFT 指南中提取整块布。

docker build -t myimage -f Dockerfile .
docker images
docker create myimage
docker run -it -p 5000:80 -d myimage

这是我用来组成图像的 Dockerfile,顺便说一句。

#Dockerfile
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0
COPY /bin/Release/netcoreapp3.0/publish/. app/
EXPOSE 80 443 5000 5001
ENTRYPOINT ["dotnet", "app/KittenSignalR.dll"]

我可以从浏览器连接到该站点,但只提供视图文件本身,不加载 JS、图像等。 在此处输入图像描述

所有其他资产都在 Chrome 控制台中显示此错误。

GET http://localhost:5000/lib/bootstrap/dist/css/bootstrap.css net::ERR_ABORTED 404 (Not Found)

但是,当我通过 bash 检查容器本身时,我可以看到所有内容,只是没有提供服务。

docker exec -i -t 46263b09f1 /bin/bash
root@46263b09f1d3:/# cd app/wwwroot/js
root@46263b09f1d3:/app/wwwroot/js# ls
Class.cs  chat.js  signalr  site.js

有小费吗?

我的应用程序中的 Startup.cs

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseDefaultFiles();
            app.UseStaticFiles();
            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapHub<ChatHub>("/chatHub");
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }

标签: c#asp.netdocker

解决方案


简短的回答:你的工作目录是/,它需要是/app


当您使用 ASP.Net Core 提供静态文件时,Microsoft 会这样说:

必须让应用程序的 Web 主机知道内容根目录。

WebHost.CreateDefaultBuilder 方法将内容根设置为当前目录

来源,强调我的。

aspnet:3.0查看您的 Dockerfile,您永远不会更改工作目录,因此它与您从(图像)1派生的基本图像保持相同。

因为您的工作目录是/,所以应用程序正在寻找一个找不到的wwwroot文件夹(本质上是)。/wwwroot这就是您在所有 wwwroot 资产上获得 404 的原因。

要解决此问题,只需更改 Docker 映像的工作目录并更新入口点以使用该 WD 的相对路径。

#Dockerfile
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0
COPY /bin/Release/netcoreapp3.0/publish/. app/
EXPOSE 80 443 5000 5001
WORKDIR app
ENTRYPOINT ["dotnet", "KittenSignalR.dll"]

1值得一提的是,您正在将文件复制到,并将工作目录设置为app. 这是一个相对目录路径,我强烈建议您将其设为绝对路径 ( /app)。

假设aspnet:3.0图像的默认工作目录为/,但我不能确定。

保持相对意味着您的文件夹结构基于基本映像的默认工作目录。它可能是根,也可能不是。最好确定绝对(双关语)并使其成为绝对路径。

#Dockerfile
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0
COPY /bin/Release/netcoreapp3.0/publish/. /app/
EXPOSE 80 443 5000 5001
WORKDIR /app
ENTRYPOINT ["dotnet", "KittenSignalR.dll"]

推荐阅读