检测进程是否在 Windows 容器内执行
Detect if process executes inside a Windows Container
很简单。
我想用代码检测我的进程是否在 windows 容器中 运行。有示例,但它们都是针对基于 linux 的容器。
我正在寻找 docker 独特且明确的东西,可以用来确定进程是否在容器托管的 windows 操作系统内执行,而不是在其他地方执行。
我的首选语言是 PowerShell,但如果有人指出如何检测,我会将其移植到 PowerShell。
以下行得通吗?
PS C:\> (Get-NetAdapter).Name -match "container"
True
从 Docker 17.06 开始,您可以使用 DNS 条目 docker.for.mac.localhost 和 docker.for.mac.localhost 以确定容器是在 mac 还是 windows 主机上运行。如果这些主机名中的 none 可以被 ping 通,您可以安全地假设它是 linux 主机。这可能不适用于 Swarms。
我不是 Bash 方面的专家,但示例可能如下所示。
#!/bin/bash
ping -c 1 docker.for.mac.localhost &>/dev/null
if [ $? -eq 0 ]; then
echo "Mac Host"
fi
ping -c 1 docker.for.win.localhost &>/dev/null
if [ $? -eq 0 ]; then
echo "Windows Host"
fi;
我希望这对您在 PowerShell 中编写脚本有所帮助,请随时在 Windows 中分享我需要的类似内容。
新读者可以跳到标有"Update"的部分,其中包含已接受的解决方案。
在命令提示符下使用 whoami 快速检查表明,在容器内使用的域和用户名的组合似乎很不寻常。所以我用这段代码来解决问题:
function Test-IsInsideContainer {
if( ($env:UserName -eq "ContainerAdministrator") -and ($env:UserDomain -eq "User Manager") ) {
$true
}
else {
$false
}
}
更新: 另一种选择是检查服务 cexecsvc 是否存在。互联网搜索并没有提供有关此服务的太多信息,但它的名称(容器执行代理)表明它仅存在于容器内部(我在 Win10 和 Server2016 Docker-host 上通过一些快速测试验证了这一点)。
所以也许这段代码符合你的要求(我是Powershell的新手):
function Test-IsInsideContainer {
$foundService = Get-Service -Name cexecsvc -ErrorAction SilentlyContinue
if( $foundService -eq $null ) {
$false
}
else {
$true
}
}
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control 下有一个 "ContainerType" 注册表值。
所以:
function Test-IsInsideContainer {
$containerType = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control").ContainerType
$containerType -ne $null
}
很简单。 我想用代码检测我的进程是否在 windows 容器中 运行。有示例,但它们都是针对基于 linux 的容器。
我正在寻找 docker 独特且明确的东西,可以用来确定进程是否在容器托管的 windows 操作系统内执行,而不是在其他地方执行。
我的首选语言是 PowerShell,但如果有人指出如何检测,我会将其移植到 PowerShell。
以下行得通吗?
PS C:\> (Get-NetAdapter).Name -match "container"
True
从 Docker 17.06 开始,您可以使用 DNS 条目 docker.for.mac.localhost 和 docker.for.mac.localhost 以确定容器是在 mac 还是 windows 主机上运行。如果这些主机名中的 none 可以被 ping 通,您可以安全地假设它是 linux 主机。这可能不适用于 Swarms。
我不是 Bash 方面的专家,但示例可能如下所示。
#!/bin/bash
ping -c 1 docker.for.mac.localhost &>/dev/null
if [ $? -eq 0 ]; then
echo "Mac Host"
fi
ping -c 1 docker.for.win.localhost &>/dev/null
if [ $? -eq 0 ]; then
echo "Windows Host"
fi;
我希望这对您在 PowerShell 中编写脚本有所帮助,请随时在 Windows 中分享我需要的类似内容。
新读者可以跳到标有"Update"的部分,其中包含已接受的解决方案。
在命令提示符下使用 whoami 快速检查表明,在容器内使用的域和用户名的组合似乎很不寻常。所以我用这段代码来解决问题:
function Test-IsInsideContainer {
if( ($env:UserName -eq "ContainerAdministrator") -and ($env:UserDomain -eq "User Manager") ) {
$true
}
else {
$false
}
}
更新: 另一种选择是检查服务 cexecsvc 是否存在。互联网搜索并没有提供有关此服务的太多信息,但它的名称(容器执行代理)表明它仅存在于容器内部(我在 Win10 和 Server2016 Docker-host 上通过一些快速测试验证了这一点)。 所以也许这段代码符合你的要求(我是Powershell的新手):
function Test-IsInsideContainer {
$foundService = Get-Service -Name cexecsvc -ErrorAction SilentlyContinue
if( $foundService -eq $null ) {
$false
}
else {
$true
}
}
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control 下有一个 "ContainerType" 注册表值。
所以:
function Test-IsInsideContainer {
$containerType = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control").ContainerType
$containerType -ne $null
}