[英]How can I run a VS2017 Angular project in a Linux Docker container?
注意 :已經有關於此主題的幾個問題,我在下面引用。 雖然這個問題在某種意義上是重復的,但我嘗試遵循其他問題的建議卻沒有成功。 有時是因為答案現在指向相關軟件包的過時版本,有時是因為不清楚如何實施更改。
這個問題是我試圖記錄一個最小的(不起作用的)示例,並提供有關如何重現此問題的完整說明。 希望我可以使用有關如何修復的類似清晰說明來對其進行更新。
我有以下環境:
以下是我創建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:
這似乎有兩件事:
Dockerfile
的文件添加到項目。 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.