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.
运行作为 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.