windows - Docker + Windows 容器:使用 PowerShell 的最佳实践
问题描述
最近,我一直在投入一些时间,从带有 bash(通常使用“eux”选项)的 Linux 上的 Docker 潜入带有 Powershell 的 Windows 容器,以获得在 Windows 中的相同体验。
但是,我很难到达那里。让我们从令人不安的 Dockerfile 开始(它可能是大多数使用 PowerShell 的 Windows 容器的基础):
FROM mcr.microsoft.com/windows/servercore:20H2-amd64
SHELL ["powershell.exe", "-NoLogo", "-NoProfile"]
# Set ExecutionPolicy = Bypass permanently
RUN Invoke-Command -ErrorAction Stop -ScriptBlock { `
Get-ExecutionPolicy -List ; `
Set-ExecutionPolicy -ExecutionPolicy Bypass ; `
Get-ExecutionPolicy -List `
}
# Install chocolatey
RUN Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
# Enable global confirmation and install general build tools
RUN Invoke-Command -ErrorAction Stop -ScriptBlock { `
$ErrorActionPreference='Stop' ; `
choco feature enable -n=allowGlobalConfirmation ; `
choco install --no-progress --no-color -y cmake --installargs 'ADD_CMAKE_TO_PATH=System' ; `
choco install --no-progress --no-color -y mingw ; `
choco install --no-progress --no-color -y make `
}
我个人最怀念的是链接多个命令的可能性,这样我就可以避免创建多余的镜像层和容器重启。Invoke-Command
但是,如果其中一个命令失败,即使我告诉停止错误并在脚本块中设置ErrorActionPreference
变量,该命令也不会停止。
希望这里的主要问题不是主要与 PowerShell 中缺少的知识有关,而是 PowerShell 如何在 Windows 容器中工作。
谢谢!