kubernetes 容器中 Window 服务 运行 的卷装载和环境变量访问

Volume mount and environment variable access for a Window service running in a container in kubernetes

运行作为 Windows 容器中的 Windows 服务的应用程序(没有任何覆盖 运行-作为用户 - New-Service -Name x -BinaryPath someservice.exe 步骤在容器构建中)期望在容器上设置环境变量以及读取安装在容器中的文件。我知道我可以 运行 应用程序直接通过入口点,它们能够从装载中读取 env 变量和文件,但作为一项服务,我收到错误提示它不是。

环境变量的范围是否默认为用户,是否需要安全上下文中的 RunAs 配置或其他机制?或者该服务对文件挂载的访问是否有任何限制?

编辑 多调查一下环境变量,似乎这可能是缺少的部分。我试图回显基于特定范围的 var:

PS C:\dir> echo ([System.Environment]::GetEnvironmentVariable("varname","User"))
PS C:\dir> echo ([System.Environment]::GetEnvironmentVariable("varname","Machine"))
PS C:\dir> echo ([System.Environment]::GetEnvironmentVariable("varname","Process"))
expected_value

所以我怀疑该服务无权访问该进程。我将尝试重新定义变量: [System.Environment]::SetEnvironmentVariable('varname',$env:varname,[System.EnvironmentVariableTarget]::Machine)

问题与环境变量作用域相关 - 传递给容器的环境变量是 Process 作用域。但是,如果 Windows 服务在容器中启动,则它无权访问范围(入口点进程有)。

为了解决这个问题,我将入口点设置为在启动 Windows 服务之前将进程范围环境变量复制到机器范围的应用程序的 powershell 包装器:

[System.Environment]::SetEnvironmentVariable('varname',$env:varname,[System.EnvironmentVariableTarget]::Machine)
# start service command.