如何在Linux Docker容器中运行VS2017 Angular项目?

时间:2019-01-25 17:56:10

标签: node.js angular docker .net-core visual-studio-2017

注意:已经有关于此主题的几个问题,我在下面引用。虽然这个问题在某种意义上是重复的,但我尝试遵循其他问题的建议却没有成功。有时是因为答案现在指向相关软件包的过时版本,有时是因为不清楚如何实施更改。

这个问题是我试图记录一个最小的(无效的)示例,并提供有关如何重现此问题的完整说明。希望我可以使用类似的明确说明来更新它,以进行修复。


我具有以下环境:

  • 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中打开此解决方案,则会看到所有希望看到的文件:

enter image description here

...并且如果我运行它(在IIS Express中),它将按预期工作:

enter image description here

到目前为止,太好了。

  

添加Docker支持

[注意:尽管我是通过.NET CLI创建项目的,但也可以使用Visual Studio UI创建项目。这样做时,新项目对话框中有一个“添加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”启动配置文件启动项目,则在下载并构建所有必需部件时会停顿很长时间,然后创建一个Docker容器,并启动一个浏览器窗口,指向{ {1}}。

在这一点上,我们看到一个错误,提示 https://localhost:44321/

enter image description here

已阅读many other questions的相关信息,我认为问题很简单,就是基本图片(在本例中为Failed to start 'npm' microsoft/dotnet:2.2-aspnetcore-runtime)不包含Node。

需要Node以便构建Angular应用程序,因为Dockerfile是用来构建它的-它依赖于Node。 (尽管我在本地计算机上有Node,但它不在构建应用程序的Docker映像上。)

因此,建议的方法是通过修改ng build将Node添加到Docker映像。

  

将节点添加到Docker映像

如上面提到的问题中所建议,我修改了Dockerfile使其包含以下内容:

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

...和... 结果完全相同

  

为什么未安装NPM?

根据@DannyB的评论,我尝试对Docker容器进行重击以直接运行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

...并且当我尝试执行docker exec -it mycontainer_id /bin/bash 时,出现错误消息“ npm:找不到命令”。因此,我想这就是它仍然无法正常工作的原因。

然后,我尝试依次直接在bash shell中执行添加到npm的每个命令。当我上线时:

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.

这将导致错误消息“ SSL证书问题:证书链中的自签名证书”。

因此,看来我的容器存在信任问题:-)。

  

为什么我的容器无法建立HTTPS连接?

每个this question似乎是因为我正在公司环境中运行,在该公司环境中,通过防火墙的SSL流量被拦截/重新加密,并且我需要配置Docker容器以信任相应的证书。

假设这是正确的,希望我能够解决信任问题,然后安装NPM,并<希望>希望解决原始问题。

我认为这个问题现在已经偏离了主题,但是如果我能够取得进一步的进展,我会继续对其进行更新。

1 个答案:

答案 0 :(得分:0)

我的工作DockerFile在apt-get之后为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"]