31

我需要附加到 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 容器上)

4

5 回答 5

48

不幸的是ENV不起作用,因为 windows 环境变量的工作方式与 linux 略有不同。更多信息

截至目前,唯一的方法是通过RUN

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

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

于 2018-03-29T06:55:54.653 回答
11

您可以使用 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
于 2017-07-05T11:52:52.467 回答
9

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

RUN setx path '%path%;C:\Foo\bin'
于 2018-06-06T09:09:19.547 回答
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

于 2020-02-25T16:27:49.347 回答
2

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

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

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

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

于 2021-07-06T16:05:09.637 回答