在同一 运行 命令中多次更新路径

Updating Path multiple times in the same RUN command

考虑以下 Dockerfile。在最后几行,首先安装了git,然后在路径环境变量中附加了一些东西。

FROM mcr.microsoft.com/windows/servercore:ltsc2022

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]

RUN Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

RUN choco install -y git
RUN [Environment]::SetEnvironmentVariable('Path', $Env:Path + ';C:\my-path', [EnvironmentVariableTarget]::Machine)

构建完成后,路径如下所示,因此将 git 添加到路径中。

C:\ProgramData\chocolatey\bin;C:\Program Files\Git\cmd;C:\my-path;

这是一个等效的 Dockerfile,但我将最后几行做成一个 RUN 命令以进行优化。

FROM mcr.microsoft.com/windows/servercore:ltsc2022

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]

RUN Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

RUN choco install -y git; \
    [Environment]::SetEnvironmentVariable('Path', $Env:Path + ';C:\my-path', [EnvironmentVariableTarget]::Machine)

构建完成后,git不在路径上!

C:\ProgramData\chocolatey\bin;C:\my-path;

为什么会这样,我该如何解决?

解决方法是使用 cmd 而不是 powershell

以下两种方法都有效:

RUN choco install -y git; \
    cmd /c "setx path '%path%;C:\my-path'"
SHELL ["cmd", "/S", "/C"]
RUN choco install -y git && \
    setx path "%path%;C:\my-path"
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]