Сборка и запуск ASP. Net Core 3.1 in Docker - PullRequest
0 голосов
/ 19 апреля 2020

Можно с уверенностью сказать, что я совсем не понимаю docker. Но, учитывая, насколько это много ажиотажа, я хочу это понять. Поэтому я пытаюсь создать docker образ работающего веб-приложения, созданного в Dot Net Core 3.1.

Веб-приложение состоит из двух частей. Встроенный интерфейс angular 9 и встроенный сервер ASP. Net Core 3.1.

SPA Angular компилируется и помещается в папку / wwwroot/ во время сборки, а не встроенный. net ядро ​​(потому что я хочу держать их отдельно).

Все это прекрасно работает на стандартном сервере IIS, на котором все это развернуто с использованием Azure Devops и CI / CD.

Сейчас. Я пытаюсь создать docker изображение этого. До сих пор я пришел к этому Dockerfile. Который строит без каких-либо ошибок.

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

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["Backend", "backend"]
RUN dotnet restore "backend/src/HolidayPlanner.Web/HolidayPlanner.Web.csproj"
COPY . .
WORKDIR "backend/src/HolidayPlanner.Web"
RUN dotnet build "HolidayPlanner.Web.csproj" -c Release -o /app/build

# Angular
FROM node:12.2.0 as angular
WORKDIR /src
ENV PATH /app/node_modules/.bin:$PATH
COPY ["Frontend/HolidayPlanner-frontend-v2", "frontend/angular/source"]
#"outputPath": "../../Backend/src/HolidayPlanner.Web/wwwroot/",
RUN npm install -g @angular/cli
WORKDIR /src/frontend/angular/source 
RUN npm install
RUN npm run build

FROM build AS publish
RUN dotnet publish "HolidayPlanner.Web.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
COPY --from=angular /src/frontend/Backend/src/HolidayPlanner.Web/wwwroot wwwroot
ENTRYPOINT ["dotnet", "HolidayPlanner.Web.dll"]

Это объединено с использованием много поиска в Google. Не стесняйтесь указывать на любые ошибки. Также обратите внимание, что причина, по которой я копирую Angular buildresult из другой папки, заключается в том, что Angular выводит свой результат в "outputPath": "../../Backend/src/HolidayPlanner.Web/wwwroot/", Это потому, что они являются отдельными, и, делая это таким образом, я могу использовать ng build --watch в VS-Code во время работы бэкэнда и вставьте фронтенд в основное приложение asp net во время выполнения. Это прекрасно работает без docker частей.

Итак, теперь к проблеме. Я не могу заставить изображение docker работать больше секунды. Я могу создать изображение с помощью docker build HolidayPlanner -t HolidayPlanner, в результате чего будет напечатано что-то вроде Successfully built sb1e10ca071a.

Затем, когда я пытаюсь запустить его с docker run -p 5000:5000 --name HolidayPlanner HolidayPlanner, он печатает длинную строку случайных чисел и букв и ничего остальное. Если я наберу Docker PS очень быстро, я вижу, что контейнер работает, но он завершается через несколько секунд. То же самое происходит, если я запускаю его из Docker UI. В настольном приложении я вижу Exited(0), напечатанный под изображением. Если я go войду в него, там нет логов или чего-нибудь полезного.

Есть ли логи? Вкладка «Журналы» на изображении в пользовательском интерфейсе пуста.

Как выяснить, что не так?

1 Ответ

0 голосов
/ 19 апреля 2020

Я понял, почему. Очевидно, вам нужно установить переменную окружения в файле docker. Wi sh Я мог бы внедрить это позже, но по крайней мере это работает.

ENTRYPOINT ["dotnet", "HolidayPlanner.Web.dll", "--environment=Development"]

Редактировать: Я нашел лучшее решение. Вместо установки среды в ENTRYPOINT ее можно отправить при запуске контейнера.

docker run -dit -p 80:80 HolidayPlanner:latest -e environment='Development'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...