Как запустить проект VS2017 Angular в контейнере Docker для Linux? - PullRequest
0 голосов
/ 25 января 2019

ПРИМЕЧАНИЕ : уже есть несколько вопросов по этой теме, на которые я ссылаюсь ниже. Хотя этот вопрос в этом смысле является дубликатом, я безуспешно пытался последовать совету по этим другим вопросам. Иногда это объясняется тем, что ответ теперь относится к устаревшей версии соответствующих пакетов, а иногда потому, что не совсем ясно, как именно осуществить изменения.

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


У меня следующая среда:

  • Windows 10 (предприятие, 1709)
  • VS2017 (15.8.4)
  • Узел (11,5)
  • Угловой CLI (7.1.4)
  • Docker Desktop (сообщество, 2.0.0.2)

Вот точные шаги, которые я выполнил для создания проекта Angular SPA:

Создать каталог для проекта

md MyAngularWebsite
cd MyAngularWebsite

Создание проекта с помощью dotnet CLI (с использованием углового шаблона)

dotnet new angular

Если я открою это решение в VS, я увижу все файлы, которые ожидаю увидеть:

enter image description here

... и если я запускаю его (в IIS Express), он работает как положено:

enter image description here

Пока все хорошо.

Добавить поддержку Docker

[ Примечание: хотя я создал проект с помощью .NET CLI, также можно создавать проекты с использованием интерфейса Visual Studio. При этом в диалоге нового проекта есть флажок «Добавить поддержку Docker». Однако этот флажок отключен для проектов Angular. Предположительно это потому, что это не работает. Однако мы можем добраться до середины, используя следующий метод. ]

Я щелкнул правой кнопкой мыши по проекту веб-сайта (MyAngularWebsite) и выбрал «Добавить поддержку Docker» во всплывающем меню.

Visual Studio запрашивает тип операционной системы, которую будет использовать образ Docker - я выбрал Linux:

enter image description here

Кажется, это делает две вещи:

  1. Добавляет файл с именем Dockerfile в проект.
  2. Добавляет новый профиль с именем "Docker" в Properties\launchSettings.json

Вот содержимое Dockerfile:

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 14242
EXPOSE 44321

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ["MyAngularWebsite.csproj", ""]
RUN dotnet restore "/MyAngularWebsite.csproj"
COPY . .
WORKDIR "/src/"
RUN dotnet build "MyAngularWebsite.csproj" -c Release -o /app

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

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

Теперь, если я запускаю проект с использованием нового профиля запуска «Docker», происходит долгая пауза, пока он загружает и создает все необходимые детали, а затем создается докер-контейнер и запускается окно браузера, указывающее на https://localhost:44321/.

Именно в этот момент мы видим ошибку, говорящую Failed to start 'npm':

enter image description here

Прочитав много других вопросов об этом, я понимаю, что проблема заключается просто в том, что базовое изображение (в данном случае microsoft/dotnet:2.2-aspnetcore-runtime, как указано в вершина Dockerfile) не включает узел.

Узел необходим для того, чтобы приложение Angular могло быть построено, поскольку ng build - это то, что используется для его сборки - и это зависит от Node. (Хотя у меня есть Node на моей локальной машине, его нет в образе Docker, на котором строится приложение).

Итак, предлагаемый подход - добавить Node к образу Docker, изменив Dockerfile.

Добавить узел в образ Docker

Как указывалось в вышеупомянутых вопросах, я изменил Dockerfile, добавив следующее:

RUN apt-get update && \
    apt-get install -y wget && \
    apt-get install -y gnupg2 && \
    wget -qO- https://deb.nodesource.com/setup_6.x | bash - && \
    apt-get install -y build-essential nodejs

Это означает, что мой полный Dockerfile теперь выглядит так:

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base

RUN apt-get update && \
    apt-get install -y wget && \
    apt-get install -y gnupg2 && \
    wget -qO- https://deb.nodesource.com/setup_6.x | bash - && \
    apt-get install -y build-essential nodejs

WORKDIR /app
EXPOSE 14242
EXPOSE 44321

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ["MyAngularWebsite.csproj", ""]
RUN dotnet restore "/MyAngularWebsite.csproj"
COPY . .
WORKDIR "/src/"
RUN dotnet build "MyAngularWebsite.csproj" -c Release -o /app

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

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

... и ... результаты точно такие же .

Почему NPM не установлен?

В соответствии с комментарием @ DannyB, я попытался залить в контейнер Docker для прямого запуска npm:

docker exec -it mycontainer_id /bin/bash

... и когда я попытался выполнить npm, я получил сообщение об ошибке " npm: команда не найдена ". Итак, я думаю, что это причина того, что он все еще не работает.

Затем я попытался выполнить каждую из команд, добавленных к Dockerfile по очереди, непосредственно в оболочке bash. Когда я добрался до линии:

wget -qO- https://deb.nodesource.com/setup_6.x

... он выполнялся без какого-либо вывода, но я понял, что это потому, что флаг -q означает «тихий режим», поэтому я выполнил его снова без q. На этот раз я получил ошибки:

ERROR: The certificate of 'deb.nodesource.com' is not trusted.
ERROR: The certificate of 'deb.nodesource.com' hasn't got a known issuer.

Копая глубже, оказывается, что я получаю ошибки, связанные с сертификатом, даже если я просто делаю:

curl https://www.google.com

Это приводит к ошибке «Ошибка сертификата SSL: самоподписанный сертификат в цепочке сертификатов».

Итак, похоже, что у моего контейнера проблемы с доверием :-).

Почему мой контейнер не может установить HTTPS-соединение?

По этот вопрос , кажется, это потому, что я работаю в корпоративной среде, где трафик SSL через брандмауэр перехватывается / перешифровывается, и мне нужно настроить свой контейнер Docker доверять соответствующему сертификату.

Предполагая, что это правильно, надеюсь, я смогу исправить проблемы с доверием, затем установить NPM и , надеюсь, решить исходную проблему.

Я думаю, что этот вопрос теперь довольно неуместен, хотя я буду продолжать его обновлять, если мне удастся добиться дальнейшего прогресса.

1 Ответ

0 голосов
/ 23 апреля 2019

Мой рабочий DockerFile имеет установленную npm для npm после apt-gets.

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

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
RUN apt-get update -yq && apt-get upgrade -yq && apt-get install -yq curl git nano
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && apt-get install -yq nodejs build-essential
RUN npm install -g npm
RUN npm install -g @angular/cli
WORKDIR /src/PAP.UI
COPY . PAP.UI.csproj
RUN dotnet restore "PAP.UI.csproj"
COPY . .
RUN dotnet build "PAP.UI.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "PAP.UI.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "PAP.UI.dll"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...