无法在 docker 图像 microsoft/dotnet:2.1-sdk 中为 windows 架构安装节点

Can't install node in docker image microsoft/dotnet:2.1-sdk for windows architecture

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

我正在尝试使用 windows 端使用 microsoft/dotnet:2.1-sdk 构建 SPA。我知道,对于 ASP.NET 核心应用程序,我可能是唯一一个试图留在 windows 端的人,但我们的集群最初只会有 windows 个服务器 运行ning本机 OS 模式而非 Hyper-V 模式。

因此,我需要为 windows 安装 node.js(因为节点。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'))

尝试安装 chocolatey 以从那里安装节点,因为 System.Net.WebClient 在此图像中不可用。

我想我的问题是是否有任何容器本机方法可以在内部安装 node.js 而无需在容器外部下载某些东西,将其复制到其中,然后执行它。如果我必须这样做,或者至少在我看来使它成为一个丑陋的解决方案,有点违背了多阶段构建的目的。

而不是 curl 使用 powershell 的 Invoke-WebRequest

而不是 unzip 使用 Expand-Archive

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

根据 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;

他们将 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 所以我可以设置 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%"