无法在 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%"
我最初在 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%"