[英]How can I run a VS2017 Angular project in a Linux Docker container?
注意 :已经有关于此主题的几个问题,我在下面引用。 虽然这个问题在某种意义上是重复的,但我尝试遵循其他问题的建议却没有成功。 有时是因为答案现在指向相关软件包的过时版本,有时是因为不清楚如何实施更改。
这个问题是我试图记录一个最小的(不起作用的)示例,并提供有关如何重现此问题的完整说明。 希望我可以使用有关如何修复的类似清晰说明来对其进行更新。
我有以下环境:
以下是我创建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容器,并启动指向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.