注意:已经有关于此主题的几个问题,我在下面引用。虽然这个问题在某种意义上是重复的,但我尝试遵循其他问题的建议却没有成功。有时是因为答案现在指向相关软件包的过时版本,有时是因为不清楚如何实施更改。
这个问题是我试图记录一个最小的(无效的)示例,并提供有关如何重现此问题的完整说明。希望我可以使用类似的明确说明来更新它,以进行修复。
我具有以下环境:
以下是我创建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容器,并启动一个浏览器窗口,指向{ {1}}。
在这一点上,我们看到一个错误,提示 https://localhost:44321/
:
已阅读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,并<希望>希望解决原始问题。
我认为这个问题现在已经偏离了主题,但是如果我能够取得进一步的进展,我会继续对其进行更新。
答案 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"]