首页 > 解决方案 > 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 容器中工作。

谢谢!

标签: windowsdockerpowershellcontainers

解决方案


推荐阅读