Docker Asp. net основное приложение не загружает мои JS, imgs - PullRequest
1 голос
/ 17 марта 2020

У меня есть базовое приложение asp. net, которое прекрасно работает при публикации. Я развернул его на docker изображении с помощью следующей серии команд, поднял всю ткань из этого руководства MSFT.

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

Вот файл Docker, который я использую для создания изображения кстати

#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, изображения и т. Д. c не загружаются. enter image description here

Все остальные ресурсы отображают эту ошибку в консоли 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?}");
            });
        }

1 Ответ

1 голос
/ 17 марта 2020

Краткий ответ: ваш рабочий каталог /, он должен быть /app.


Когда вы обслуживаете stati c файлы с ASP. Net Core, Microsoft говорит следующее:

Веб-хост приложения должен знать о каталоге root содержимого.

Метод WebHost.CreateDefaultBuilder устанавливает для содержимого root значение текущий каталог

Источник , выделено мое.

Глядя на свой файл Docker, вы никогда не меняете рабочий каталог, поэтому он остается таким же, как базовый образ, из которого вы извлекаете его (aspnet:3.0 изображение) 1 .

Поскольку ваш рабочий каталог /, приложение ищет папку wwwroot (по существу * 1027) *), который он не может найти. Вот почему вы получаете 404 для всех ваших wwwroot активов.

Чтобы это исправить, просто измените рабочий каталог образа 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 имеет рабочий каталог по умолчанию /, но я не уверен.

Если оставить его относительно, это означает, что вы основываете свою структуру папок из рабочего каталога по умолчанию для базового образа. Это может быть root, а может и нет. Лучше убедиться в абсолютности (каламбур) и сделать его абсолютным путем.

#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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...