繁体   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