c# - 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?}");
});
}
解决方案
简短的回答:你的工作目录是/
,它需要是/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"]
推荐阅读
- java - 使用 JNA 从 dll 中获取类型
- php - PHP & Carousel - 在我的数据库中获取图像的轮播中循环图像
- oauth-2.0 - 如何在没有最终用户在 Azure 中使用 AD 帐户登录的情况下保护 API?
- python - BeautifulSoup 提取文本
- sql-server - SQL Server 将日期时间转换为不带空值的日期
- c++ - 如何在另一个线程中创建互斥锁?
- python - 通过数据框列解析以创建新的数据框
- python - 当它不扩展到列表时如何修复字符串覆盖
- jquery-query-builder - 有没有办法将所选的 jQuery Query Builder 过滤器描述为纯文本?
- java - 为什么java上的图形什么都不输出?