【问题标题】:Appending to PATH in a Windows Docker container在 Windows Docker 容器中附加到 PATH
【发布时间】:2017-02-07 14:53:07
【问题描述】:

我需要附加到 Windows Docker 容器中的 PATH,并且我已经尝试了很多排列。

ENV PATH=%PATH%;C:\\Foo\\bin
ENV PATH=$PATH;C:\\Foo\\bin
ENV PATH="%PATH%;C:\Foo\bin"
ENV PATH="$PATH;C:\Foo\bin"
RUN "set PATH=%PATH%;C:\Foo\bin"

这些都不起作用:它们不评估预先存在的 PATH 变量。

附加到 PATH 的正确语法是什么?我什至可以附加到 Docker 内的 PATH 吗? (我可以在类似的 Linux 容器上)

【问题讨论】:

  • 传递给 Docker 容器的环境变量仅对 docker 可执行文件执行的进程可见。它们不会在机器范围内可见。但是,如果您对此感到满意,那么为什么不在启动期间读取此变量并将其附加到容器内的 PATH 变量中。环境变量在系统范围内不可见的问题在这里github.com/docker/docker/issues/30192
  • @GSA,如果没有解决方案,我也会认为这是一个答案。但令我惊讶的是,“附加到我的容器环境的 PATH”并不是 Windows 容器的已解决用户故事。

标签: docker containers windows-container


【解决方案1】:

很遗憾,ENV 不起作用,因为 windows 环境变量的工作方式与 linux 略有不同。 more info

目前唯一的方法是通过RUN

但您不需要创建单独的文件来执行此操作。这可以通过以下更简单的一行命令来完成:

RUN setx path "%path%;C:\Foo\bin"

【讨论】:

  • PS 等效:RUN setx /M PATH $($Env:PATH + ';C:\Foo\bin)
  • @JasonCoder - 谢谢!只是在最后一个括号之前缺少最后一个单引号。
  • 我们今天尝试了您的解决方案,遇到了 setx 不起作用但只有 ENV 的问题,如下所示:github.com/PowerShell/PowerShell-Docker/issues/164 我很困惑;但无论如何,我们很快就会切换到 linux 容器......
【解决方案2】:

您可以使用 powershell 脚本在容器中永久设置环境变量。

在您的 docker 上下文(例如 setpath.ps1 )中创建一个包含以下内容的 powershell 脚本:

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Foo\bin", [EnvironmentVariableTarget]::Machine)

将此脚本添加到您的容器 dockerfile 并运行该脚本。将这样的内容添加到您的 dockerfile 中:

ADD ./setpath.ps1 c:/MyScripts/setpath.ps1
RUN powershell -Command c:\MyScripts\setpath.ps1

【讨论】:

  • 这对我不起作用。 PATH 变量和以前一样,不管我的 dockerfile 中是否有这一行。有什么想法吗?
【解决方案3】:

[Environment]::SetEnvironmentVariable 是一个好方法,但在 nanoserver 中不起作用。 最好的选择是:

RUN setx path '%path%;C:\Foo\bin'

【讨论】:

    【解决方案4】:

    这对我有用:

    USER ContainerAdministrator
    RUN setx /M PATH "%PATH%;C:/your/path"
    USER ContainerUser
    

    如 .net sdk Dockerfile 中所示:https://github.com/dotnet/dotnet-docker/blob/20ea9f045a8eacef3fc33d41d58151d793f0cf36/2.1/sdk/nanoserver-1909/amd64/Dockerfile#L28-L29

    【讨论】:

    • 这对我有用!在 Windows Nano Server 1909 上测试
    【解决方案5】:

    尽管之前有所有答案,但我在某些环境中遇到了问题。基本上在自定义本地测试环境中,使用 %PATH%;C:\foo\bar 方式的 setx 即使文件夹有 C:\Program Files 之类的空格也可以工作。虽然在我们的生产环境中尝试它时不起作用。 检查微软在他们自己的镜像上安装基础包时做了什么,结果发现更好、更可靠的方法是这样使用命令:

    RUN setx /M PATH $(${Env:PATH} + \";${Env:ProgramFiles(x86)}\foo\bar\")
    

    这样 docker 将能够获取正确的路径并正确更新 PATH 数据。

    编辑: 感谢 Robin Ding,我已经修复了命令中缺少的尾随 \ :)

    【讨论】:

    • 末尾缺少 \:RUN setx /M PATH $(${Env:PATH} + \";${Env:ProgramFiles(x86)}\foo\bar\") 也适用于空格:RUN setx /M PATH $(${Env:PATH} + \";${Env:ProgramFiles(x86)}\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多