【问题标题】:How can I run a VS2017 Angular project in a Linux Docker container?如何在 Linux Docker 容器中运行 VS2017 Angular 项目?
【发布时间】:2019-06-19 14:22:16
【问题描述】:

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

这个问题是我尝试记录一个最小的(非)工作示例,其中包含有关如何重现该问题的完整说明。希望我可以更新它,提供关于如何修复它的类似明确说明。


我有以下环境:

  • Windows 10(企业版,1709)
  • VS2017 (15.8.4)
  • 节点 (11.5)
  • Angular CLI (7.1.4)
  • Docker 桌面(社区,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 容器,并启动一个指向 @ 的浏览器窗口987654341@.

此时我们看到错误提示 Failed to start 'npm':

在阅读了many other questions 之后,我认为问题只是基本映像(在本例中为microsoft/dotnet:2.2-aspnetcore-runtime,在Dockerfile 的顶部指定)不包括节点.

Node 是必需的,这样才能构建 Angular 应用程序,因为 ng build 是用来构建它的 - 并且依赖于 Node.js。 (虽然我的本地机器上有 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 的评论,我尝试 bash-ing 进入 Docker 容器以直接运行 npm

docker exec -it mycontainer_id /bin/bash

...当我尝试执行 npm 时,我收到一条错误消息“npm: command not found”。所以,我想这就是它仍然无法正常工作的原因。

然后我尝试直接在 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 连接?

根据this question,这似乎是因为我在企业环境中运行,通过防火墙的 SSL 流量被拦截/重新加密,我需要配置我的 Docker 容器以信任相应的证书.

假设这是正确的,希望我能够解决信任问题,然后安装 NPM,希望解决最初的问题。

我认为这个问题现在已经偏离了主题,但如果我设法取得进一步的进展,我会继续更新它。

【问题讨论】:

  • 您是否尝试过在第二个 Docker 构建步骤中安装节点?当 bashing 进入容器时 - 你可以运行 npm 吗?
  • 这可能是一个愚蠢的问题,但您是否在更改 Dockerfile 后重建了映像?
  • @DannyB:是的,我试过了——不走运。我还没有尝试过 bash - 我会在星期一尝试。
  • @dongi:是的,我做到了。
  • @DannyB:我尝试使用bash 在容器内运行npm - 不走运,它不存在。我已经更新了这个问题,但我会将 can't-install-npm 问题作为一个单独的问题来处理,以避免污染这个问题。谢谢。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-04-14
    • 2018-04-09
    • 2017-05-23
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    相关资源
    最近更新 更多