Stati c Файлы в wwwroot, не содержащиеся в Docker Image - PullRequest
0 голосов
/ 24 февраля 2020

просто немного поиграю. Я получил решение Visual Studio, содержащее 3 проекта. Все три необходимы. Один проект («один») - это пользовательский интерфейс приложения. Он, конечно, содержит c файлов в wwwroot.

Я хочу докеризировать приложение. Dockerfile здесь работает. Затем я загружаю это изображение через kubernetes на сервер Ubuntu.

Нет проблем, контейнер работает и обслуживает запросы.

Но он вообще не обслуживает файлы stati c. Все эти файловые запросы приводят к ошибке 404 HTTP. Веб-сайт выглядит как rubbi sh (но загружается, хотя).

Итак, я вошел в контейнер и начал наблюдать за содержимым / app. Здесь нет каталога с именем "wwwroot". Тоже не подкаталоги. Я не уверен, если каталог wwwroot принадлежит здесь? Или каталог включен в dll приложения?

После большого поиска (также нашел несколько полезных вопросов здесь, в StackOverflow), я обнаружил, что файлы включаются в процесс сборки автоматически. Нет необходимости определять их отдельно в файле csproj. Но если я это сделаю, это приведет к ошибке типа «Включены дубликаты файлов» или что-то в этом роде.

Вот файл Docker:

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

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY one/one.csproj one/
COPY two/two.csproj two/
COPY three/three.csproj three/
COPY . ./

WORKDIR "/src/one"
RUN dotnet build -c Release -o /app
WORKDIR "/src/two"
RUN dotnet build -c Release -o /app
WORKDIR "/src/three"
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

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

Да, я использую UseStaticFiles:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }
    // IMPORTANT: This session call MUST go before UseMvc()
    app.UseSession();
    app.UseStaticFiles();
    ...

И к файлам stati c (в основном) обращаются с правильной чувствительностью к регистру. Но, как я уже сказал, нет файлов stati c. Доступ к файлам

. В приложениях "Виды" мое приложение включает в себя CSS файлы, подобные этим:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="~/framework/1.css">
    <link rel="stylesheet" href="~/framework/2.css" media="screen,projection">
    ...

Во время работы внутри docker это приводит к HTML Выводу этого:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="/framework/1.css">
    <link rel="stylesheet" href="/framework/2.css" media="screen,projection">
    ...

См. Отсутствующую тильду ~?

Как можно узнать c файлы будут включены в docker изображение?

Спасибо! xola

1 Ответ

2 голосов
/ 25 февраля 2020

Хорошо, теперь я узнал сам.

Ошибка была в самом Dockerfile. Мне нужно было явно указать, какой файл csproj создать, а какой опубликовать sh. Это то, что я узнал здесь .

На самом деле, нет необходимости определять что-то вроде «включить этот файл и этот каталог» в файл csproj.

И это на самом деле важно сказать, что каталог wwwroot НЕ компилируется в dll. Он существует внутри папки / app в контейнере (эту информацию я нигде не смог найти, но я получил подсказку здесь ).

Это также дает возможность сопоставить внешнюю папку к контейнеру (чтобы вы могли редактировать файлы * stati c без необходимости повторной стыковки его снова и снова - конечно, это не предназначено для производственных сред).

Также важно сказать, что для производственных сред и, как правило, для всех stati c файлов, которые вы не хотите вводить в образ (например, исходный S CSS, un- обфусцированный JS, временные файлы, копии резервных копий копии файла и т. д.), следует использовать файл .dockerignore.

В противном случае файлы stati c могут быть доступны непосредственно через браузер, поскольку они поступают непосредственно в * Каталог 1020 *.

Итак, вот мой рабочий Dockerfile.

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

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY all.sln ./    # not sure if I need this
COPY one/one.csproj one/
COPY two/two.csproj two/
COPY three/three.csproj three/
COPY . ./

RUN dotnet build "/src/one/one.csproj" -c Release -o /app
RUN dotnet build "/src/two/two.csproj" -c Release -o /app
RUN dotnet build "/src/three/three.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "/src/one/one.csproj" -c Release -o /app

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

Надеюсь, мои объяснения помогут другим с этой проблемой в будущем.

Спасибо! xola

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...