Can';t在docker映像microsoft/dotnet:2.1-sdk for windows体系结构中安装节点

Can';t在docker映像microsoft/dotnet:2.1-sdk for windows体系结构中安装节点,docker,.net-core,asp.net-core-2.1,Docker,.net Core,Asp.net Core 2.1,我最初问这个问题是在:作为反对声明的一部分,我希望SO社区对此有一个好的答案: 我正在尝试使用windows端,使用microsoft/dotnet:2.1-sdk进行SPA构建。我知道,我可能是唯一一个尝试在windows端运行ASP.NET核心应用程序的人,但我们的swarm最初将只在本机操作系统模式下运行windows服务器,而不是在Hyper-V模式下运行 因此,我需要安装node.js for windows(因为node.js/grunt/gulp不再像在microsoft/aspn

我最初问这个问题是在:作为反对声明的一部分,我希望SO社区对此有一个好的答案:

我正在尝试使用windows端,使用microsoft/dotnet:2.1-sdk进行SPA构建。我知道,我可能是唯一一个尝试在windows端运行ASP.NET核心应用程序的人,但我们的swarm最初将只在本机操作系统模式下运行windows服务器,而不是在Hyper-V模式下运行

因此,我需要安装node.js for windows(因为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中,也不在任何其他目录中

curl也不在这张图片中,所以我不能用它来下载任何东西,即使我可以,我如何取消tar或解压缩任何东西

我无法运行以下的powershell调用:

iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
尝试安装Chocolate以便从此处安装节点,因为System.Net.WebClient在此图像中不可用


我想我的问题是,是否有任何容器本机方法可以在内部安装node.js,而不必在容器外部下载、复制并执行它。如果我不得不这样做的话,这有点违背了多级构建的目的,或者至少在我看来,这是一个丑陋的解决方案。

相反,使用powershell的
调用WebRequest

相反,请使用
展开存档


无法在nanoserver中安装MSI。有关解决方案,请参见:

根据Miq I的答案,我能够创建一个初始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;

他们向基本运行时添加了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

另一种方法是使用
ADD
并以
Administrator
身份运行,这样我就可以设置
路径

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%"

我会尽量让你知道,谢谢你的快速反应!使用powershell以交互方式打开容器并执行这两个方法只是为了测试此方法是否可行,它们都会执行,一旦我设置了powershell命令以使节点工作,我将发布我所做的并接受您的回答。作为旁白,看起来Windows Server版本1803的容器映像中甚至没有安装PowerShell,但我被告知curl本机工作,因此可以使用它。