追加到Windows Docker容器中的PATH

8i9zcol2  于 2023-04-05  发布在  Docker
关注(0)|答案(8)|浏览(121)

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

7hiiyaii

7hiiyaii1#

不幸的是,ENV不能工作,因为windows环境变量的工作方式与linux有点不同。more info
到目前为止,唯一的方法是通过RUN
但是你不需要创建一个单独的文件来完成这个操作。这可以通过下面简单得多的一行命令来完成:
RUN setx path "%path%;C:\Foo\bin"

sqyvllje

sqyvllje2#

您可以使用powershell脚本在容器中永久设置环境变量。
在yout docker上下文中创建一个powershell脚本(例如setpath.ps1),包含以下内容:

[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
6ss1mwsb

6ss1mwsb3#

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

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

46scxncf4#

这对我很有效:

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

5kgi1eie

5kgi1eie5#

不管前面的所有答案,我在一些环境中遇到了一个问题。C:\foo\bar* 方式即使在文件夹中有 C:\Program Files 这样的空格时也可以工作。但在我们的生产环境中尝试时却不起作用。检查Microsoft在自己的镜像上安装基本包时会做什么,结果证明更好更可靠的方法是使用命令如下:

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

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

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

dtcbnfnu

dtcbnfnu6#

下面是我在nanoserver-1809中的工作(来自这个GitHub问题):

ENV PATH="$WindowsPATH;C:\Foo\bin"
fnx2tebb

fnx2tebb7#

我的答案和mirsik的相似,但是不需要单独的脚本,只要把它放到你的Dockerfile中就可以了

RUN $env:PATH = 'C:\Foo\bin;{0}' -f $env:PATH ; \
[Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine)
qyyhg6bp

qyyhg6bp8#

下面的命令在Dockerfile和基本图像mcr.microsoft.com/windows/servercore:ltsc2019中对我有效。
(My场景是在PATH中设置Java。即使路径中有空格,它也可以工作)
(Make确保使用您的应用程序/工具更新JAVA_HOME环境变量)

ENV JAVA_HOME="C:\Program Files\Java\jdk-17"

RUN $newPath = ('{0}\bin;{1}' -f $env:JAVA_HOME, $env:PATH); \
     [Environment]::SetEnvironmentVariable('PATH', $newPath, [EnvironmentVariableTarget]::Machine)

CMD ["java", "--version"]
  • 顺便说一下,我在尝试这里的一些其他答案时确实得到了如下错误(原因如-路径中有空格,或者Env变量${Env:ProgramFiles}没有正确解析等)*
    • 术语“C:\Program”不能识别为cmdlet的名称。*
    • 表达式或语句中出现意外标记'\Java\jdk-17\bin'。*

相关问题