无法在Windows架构的docker image Microsoft / dotnet:2.1-sdk中安装节点

时间:2018-06-22 04:13:38

标签: docker .net-core asp.net-core-2.1

最初,我在https://github.com/aspnet/aspnet-docker/issues/349问这个问题,作为弃用声明的一部分,我希望SO社区对此有一个好的答案:

我正在尝试使用 microsoft / dotnet:2.1-sdk 将Windows端用于SPA构建。我知道,我可能是唯一一个试图停留在ASP.NET Core应用程序的Windows端的人,但是最初我们的团队只会将Windows服务器以本机OS模式而不是Hyper-V模式运行。

因此,我需要为Windows安装node.js(因为node.js / grunt / gulp不再是图像的一部分,就像它们在 microsoft / aspnetcore:2.0 中一样图片),我尝试过:

RUN msiexec.exe /a https://nodejs.org/dist/v8.11.3/node-v8.11.3-x64.msi /quiet

msiexec.exe 不在此图像的c:\ windows \ system32或任何其他目录中。

卷曲也不在此图像中,因此我无法使用它来下载任何内容,即使我如何解压缩或解压缩任何内容?

我无法运行以下功能的Powershell调用

iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

尝试安装Chocolatey以便从那里安装节点,因为此图像中没有 System.Net.WebClient

我想我的问题是,有没有一种容器本机方法可以在内部安装node.js,而不必在容器外部下载内容,将其复制并执行。如果我必须这样做或者至少在我看来使它成为一个丑陋的解决方案,Kinda会破坏多阶段构建的目的。

4 个答案:

答案 0 :(得分:1)

代替curl使用powershell的Invoke-WebRequest

代替unzip使用Expand-Archive

无法在nanoserver中安装MSI。有关解决方案,请参见:Powershell Silent Install in Nano Server with Docker

答案 1 :(得分:1)

根据Miq的答案,我能够创建一个初始的Dockerfile,该文件使用2.1 SDK映像并手动拉入节点,如下所示:

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /app
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

ENV NODE_VERSION 8.11.3
ENV NODE_FULL_NAME node-v8.11.3-win-x64

#install node and npm as MS no longer does this in any .NET Core nanoserver based images since 2.1
RUN New-Item -ItemType directory -Path /build; \
    Invoke-WebRequest https://nodejs.org/dist/v${env:NODE_VERSION}/${env:NODE_FULL_NAME}.zip -OutFile /build/${env:NODE_FULL_NAME}.zip; \
    Expand-Archive -LiteralPath /build/${env:NODE_FULL_NAME}.zip /build; \
    $newPath = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path; \
    $nodeFullName = ${env:NODE_FULL_NAME}; \
    $newPath = $newPath + ';/build/' + $nodeFullName; \
    Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath;

答案 2 :(得分:0)

他们在基本运行时中添加了Tar和Curl。

FROM microsoft/dotnet:2.2-aspnetcore-runtime-nanoserver-1803 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

#Download the package we want and unzip it to our destination
RUN curl.exe -o node.zip https://nodejs.org/dist/v10.15.3/node-v10.15.3-win-x64.zip && \
  mkdir "C:\\Program Files\\node" && \
  tar.exe -xf node.zip -C "C:\\Program Files\\node" --strip-components=1

答案 3 :(得分:0)

另一种方法,使用ADD并以Administrator身份运行,因此我可以设置PATH

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-nanoserver-1903 as base
USER Administrator
WORKDIR /app
EXPOSE 80
EXPOSE 443
EXPOSE 1433
ADD https://nodejs.org/dist/v12.9.1/node-v12.9.1-win-x64.zip C:\\build\\node-v12.9.1-win-x64.zip
RUN mkdir "C:\\Program Files\\node" && \
  tar.exe -xf C:\\build\\node-v12.9.1-win-x64.zip -C "C:\\Program Files\\node" --strip-components=1
RUN setx /M PATH "C:\Program Files\node;%PATH%"