【发布时间】: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
使用
dotnetCLI(使用 Angular 模板)创建项目
dotnet new angular
如果我在 VS 中打开这个解决方案,我会看到我希望看到的所有文件:
...如果我运行它(在 IIS Express 中),它会按预期工作:
到目前为止,一切都很好。
添加 Docker 支持
[注意:虽然我是通过 .NET CLI 创建项目的,但也可以使用 Visual Studio UI 创建项目。执行此操作时,新项目对话框中有一个“添加 Docker 支持”复选框。但是,对于 Angular 项目,该复选框是禁用的。大概这是因为它不起作用。但是,我们可以使用以下方法到达一半。]
我右键单击网站项目(MyAngularWebsite),然后从弹出菜单中选择“添加 Docker 支持”。
Visual Studio 询问 Docker 映像将使用的操作系统类型 - 我选择了 Linux:
这似乎做了两件事:
- 将名为
Dockerfile的文件添加到项目中。 - 将名为“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