我有一个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方法将内容根目录设置为当前目录
来源,重点是我的。
查看您的Dockerfile,您永远不会更改工作目录,因此它与您从(aspnet:3.0
映像)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"]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句