最初,我在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会破坏多阶段构建的目的。
答案 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%"