簡體   English   中英

如何在Linux Docker容器中運行VS2017 Angular項目?

[英]How can I run a VS2017 Angular project in a Linux Docker container?

注意 :已經有關於此主題的幾個問題,我在下面引用。 雖然這個問題在某種意義上是重復的,但我嘗試遵循其他問題的建議卻沒有成功。 有時是因為答案現在指向相關軟件包的過時版本,有時是因為不清楚如何實施更改。

這個問題是我試圖記錄一個最小的(不起作用的)示例,並提供有關如何重現此問題的完整說明。 希望我可以使用有關如何修復的類似清晰說明來對其進行更新。


我有以下環境:

  • Windows 10 (企業,1709年)
  • VS2017 (15.8.4)
  • 節點 (11.5)
  • Angular CLI (7.1.4)
  • Docker Desktop (社區,2.0.0.2)

以下是我創建Angular SPA項目所遵循的確切步驟:

為項目創建目錄

md MyAngularWebsite
cd MyAngularWebsite

使用dotnet CLI(使用Angular模板)創建項目

dotnet new angular

如果我在VS中打開此解決方案,則會看到希望看到的所有文件:

在此處輸入圖片說明

...並且如果我運行它(在IIS Express中),它將按預期工作:

在此處輸入圖片說明

到現在為止還挺好。

添加Docker支持

[ 注意:盡管我是通過.NET CLI創建項目的,但也可以使用Visual Studio UI創建項目。 這樣做時,新項目對話框中有一個“添加Docker支持”復選框。 但是,該復選框對於Angular項目是禁用的。 大概是因為它不起作用。 但是,我們可以使用以下方法中途到達。 ]

我右鍵單擊網站項目( MyAngularWebsite ),然后從彈出菜單中選擇“添加Docker支持”。

Visual Studio詢問Docker映像將使用的操作系統類型-我選擇了Linux:

在此處輸入圖片說明

這似乎有兩件事:

  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”啟動配置文件啟動項目,則在下載並構建所有必需部件時會停頓很長時間,然后創建一個Docker容器,並啟動指向https://localhost:44321/的瀏覽器窗口https://localhost:44321/

正是在這一點上,我們看到一條錯誤消息,提示Failed to start 'npm'

在此處輸入圖片說明

看了許多 其他 問題這一點,據我了解,這個問題很簡單,基本圖像(在這種情況下, microsoft/dotnet:2.2-aspnetcore-runtime作為在頂部指定Dockerfile )不包括節點。

必須使用Node才能構建Angular應用程序,因為ng build是用來構建它的-它依賴於Node。 (盡管我在本地計算機上有Node,但它不在構建應用程序的Docker映像上)。

因此,建議的方法是通過修改Dockerfile將Node添加到Docker映像。

將節點添加到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:找不到命令 ”。 因此,我想這就是它仍然無法正常工作的原因。

然后,我嘗試直接在bash shell中依次執行添加到Dockerfile每個命令。 當我上線時:

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,並希望解決原始問題。

我認為這個問題現在已經偏離了主題,但是如果我能夠取得進一步的進展,我將繼續對其進行更新。

我的工作DockerFile在apt-gets之后為npm安裝了npm。

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"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM