如何在aspnet Nanoserver docker容器中安装Powershell Core



是否可以以某种方式将Powershell Core添加到AspNet Nano服务器的基本映像中?

我们使用多级dockerfile来生成包含.net核心web应用程序的图像。最终的图像基于mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1809,并添加了我们的.net核心二进制文件(以将图像大小保持在最低限度(。

出于初始化和调试的目的,我们希望Powershell Core包含在最终映像中,但到目前为止还没有找到方法。我们考虑了各种命令行安装选项(msiexec、choco和谷歌搜索了很多(,但没有找到解决方案。

非常感谢您的帮助!

来自微软:

默认情况下不再包括PowerShell Core、.NET Core和WMI,但在构建容器时可以包括PowerShell Core和.NET Core容器包。

虽然powershell coreaspnet:3.1-nanoserver-1809没有官方支持,但powershell core对纯nanoserver-18.09有官方支持,请参阅图片标签:lts-nanoserver-1809

所以,你最不需要做的就是:

按照微软对include powershell core when build your own image的建议。

接下来是关于nanoserver-18.09如何包含powershell core的Dockerfile,您可以复制它来编写自己的Dockerfle,将powershell core添加到aspnet:3.1-nanoserver-1809:

# escape=`
# Args used by from statements must be defined here:
ARG InstallerVersion=nanoserver
ARG InstallerRepo=mcr.microsoft.com/powershell
ARG NanoServerRepo=mcr.microsoft.com/windows/nanoserver
# Use server core as an installer container to extract PowerShell,
# As this is a multi-stage build, this stage will eventually be thrown away
FROM ${InstallerRepo}:$InstallerVersion  AS installer-env
# Arguments for installing PowerShell, must be defined in the container they are used
ARG PS_VERSION=7.0.0-rc.1
ARG PS_PACKAGE_URL=https://github.com/PowerShell/PowerShell/releases/download/v$PS_VERSION/PowerShell-$PS_VERSION-win-x64.zip
# disable telemetry
ENV POWERSHELL_TELEMETRY_OPTOUT="1"
SHELL ["pwsh", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
ARG PS_PACKAGE_URL_BASE64
RUN Write-host "Verifying valid Version..."; `
if (!($env:PS_VERSION -match '^d+.d+.d+(-w+(.d+)?)?$' )) { `
throw ('PS_Version ({0}) must match the regex "^d+.d+.d+(-w+(.d+)?)?$"' -f $env:PS_VERSION) `
} `
$ProgressPreference = 'SilentlyContinue'; `
if($env:PS_PACKAGE_URL_BASE64){ `
Write-host "decoding: $env:PS_PACKAGE_URL_BASE64" ;`
$url = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($env:PS_PACKAGE_URL_BASE64)) `
} else { `
Write-host "using url: $env:PS_PACKAGE_URL" ;`
$url = $env:PS_PACKAGE_URL `
} `
Write-host "downloading: $url"; `
[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12; `
New-Item -ItemType Directory /installer > $null ; `
Invoke-WebRequest -Uri $url -outfile /installer/powershell.zip -verbose; `
Expand-Archive /installer/powershell.zip -DestinationPath PowerShell
# Install PowerShell into NanoServer
FROM ${NanoServerRepo}:1809
ARG IMAGE_NAME=mcr.microsoft.com/powershell
# Copy PowerShell Core from the installer container
ENV ProgramFiles="C:Program Files" `
# set a fixed location for the Module analysis cache
PSModuleAnalysisCachePath="C:UsersPublicAppDataLocalMicrosoftWindowsPowerShelldockerModuleAnalysisCache" `
# Persist %PSCORE% ENV variable for user convenience
PSCORE="$ProgramFilesPowerShellpwsh.exe" `
# Set the default windows path so we can use it
WindowsPATH="C:Windowssystem32;C:Windows" `
POWERSHELL_DISTRIBUTION_CHANNEL="PSDocker-NanoServer-1809"
### Begin workaround ###
# Note that changing user on nanoserver is not recommended
# See, https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/container-base-images#base-image-differences
# But we are working around a bug introduced in the nanoserver image introduced in 1809
# Without this, PowerShell Direct will fail
# this command sholud be like this: https://github.com/PowerShell/PowerShell-Docker/blob/f81009c42c96af46aef81eb1515efae0ef29ad5f/release/preview/nanoserver/docker/Dockerfile#L76
USER ContainerAdministrator
# This is basically the correct code except for the /M
RUN setx PATH "%PATH%;%ProgramFiles%PowerShell;" /M
USER ContainerUser
### End workaround ###
COPY --from=installer-env ["\PowerShell\", "$ProgramFiles\PowerShell"]
# intialize powershell module cache
RUN pwsh `
-NoLogo `
-NoProfile `
-Command " `
$stopTime = (get-date).AddMinutes(15); `
$ErrorActionPreference = 'Stop' ; `
$ProgressPreference = 'SilentlyContinue' ; `
while(!(Test-Path -Path $env:PSModuleAnalysisCachePath)) {  `
Write-Host "'Waiting for $env:PSModuleAnalysisCachePath'" ; `
if((get-date) -gt $stopTime) { throw 'timout expired'} `
Start-Sleep -Seconds 6 ; `
}"
# re-enable telemetry
ENV POWERSHELL_TELEMETRY_OPTOUT="0"
CMD ["pwsh.exe"]

最新更新