在 Windows Docker 容器中附加到 PATH
Appending to PATH in a Windows Docker container
我需要在 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"
None 这些工作:他们不评估预先存在的 PATH 变量。
附加到 PATH 的正确语法是什么?我什至可以附加到 Docker 内的路径吗? (我可以在类似的 Linux 容器上)
您可以使用 powershell 脚本在容器中永久设置环境变量。
在您的 docker 上下文(例如 setpath.ps1 )中创建一个包含以下内容的 powershell 脚本:
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Foo\bin", [EnvironmentVariableTarget]::Machine)
将此脚本添加到您的容器 docker 文件和 运行 脚本。在您的 docker 文件中添加这样的内容:
ADD ./setpath.ps1 c:/MyScripts/setpath.ps1
RUN powershell -Command c:\MyScripts\setpath.ps1
不幸的是,ENV
不起作用,因为 windows 环境变量的工作方式与 linux 略有不同。 more info
目前唯一的方法是通过 RUN
但是您不需要创建单独的文件来执行此操作。这可以通过以下更简单的一行命令来完成:
RUN setx path "%path%;C:\Foo\bin"
[Environment]::SetEnvironmentVariable
是个好方法,但在 nanoserver 中行不通。
最佳选择是:
RUN setx path '%path%;C:\Foo\bin'
这对我有用:
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
尽管之前有所有答案,但我在某些环境中遇到了问题。基本上在自定义本地测试环境中,setx 使用 %PATH%;C:\foo\bar 方式工作,即使文件夹有像 C:\Program 这样的空格文件。虽然在我们的生产环境中尝试时没有用。
检查微软在他们自己的图像上安装基础包时做了什么,事实证明更好更可靠的方法是以这种方式使用命令:
RUN setx /M PATH $(${Env:PATH} + \";${Env:ProgramFiles(x86)}\foo\bar\")
这样docker将能够获取正确的路径并正确更新 PATH 数据。
编辑:
我已经修复了命令中丢失的尾随 \,感谢 Robin Ding :)
我需要在 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"
None 这些工作:他们不评估预先存在的 PATH 变量。
附加到 PATH 的正确语法是什么?我什至可以附加到 Docker 内的路径吗? (我可以在类似的 Linux 容器上)
您可以使用 powershell 脚本在容器中永久设置环境变量。
在您的 docker 上下文(例如 setpath.ps1 )中创建一个包含以下内容的 powershell 脚本:
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Foo\bin", [EnvironmentVariableTarget]::Machine)
将此脚本添加到您的容器 docker 文件和 运行 脚本。在您的 docker 文件中添加这样的内容:
ADD ./setpath.ps1 c:/MyScripts/setpath.ps1
RUN powershell -Command c:\MyScripts\setpath.ps1
不幸的是,ENV
不起作用,因为 windows 环境变量的工作方式与 linux 略有不同。 more info
目前唯一的方法是通过 RUN
但是您不需要创建单独的文件来执行此操作。这可以通过以下更简单的一行命令来完成:
RUN setx path "%path%;C:\Foo\bin"
[Environment]::SetEnvironmentVariable
是个好方法,但在 nanoserver 中行不通。
最佳选择是:
RUN setx path '%path%;C:\Foo\bin'
这对我有用:
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
尽管之前有所有答案,但我在某些环境中遇到了问题。基本上在自定义本地测试环境中,setx 使用 %PATH%;C:\foo\bar 方式工作,即使文件夹有像 C:\Program 这样的空格文件。虽然在我们的生产环境中尝试时没有用。 检查微软在他们自己的图像上安装基础包时做了什么,事实证明更好更可靠的方法是以这种方式使用命令:
RUN setx /M PATH $(${Env:PATH} + \";${Env:ProgramFiles(x86)}\foo\bar\")
这样docker将能够获取正确的路径并正确更新 PATH 数据。
编辑: 我已经修复了命令中丢失的尾随 \,感谢 Robin Ding :)