这很简单。我想用代码检测我的进程是否在Windows容器中运行。有一些例子,但它们都适用于基于 linux 的容器。
我正在寻找对 docker 来说独特且明确的东西,它可以用来得出一个安全的结论,一个进程是否在容器托管的 Windows 操作系统中执行,而不是在其他情况下。
我的首选语言是 PowerShell,但如果有人指出如何检测,我会将其移植到 PowerShell。
这很简单。我想用代码检测我的进程是否在Windows容器中运行。有一些例子,但它们都适用于基于 linux 的容器。
我正在寻找对 docker 来说独特且明确的东西,它可以用来得出一个安全的结论,一个进程是否在容器托管的 Windows 操作系统中执行,而不是在其他情况下。
我的首选语言是 PowerShell,但如果有人指出如何检测,我会将其移植到 PowerShell。
新读者可以跳到标有“更新”的部分,其中包含已接受的解决方案。
在命令提示符下使用whoami快速检查表明,在容器内使用的域和用户名的组合似乎相当不寻常。所以我用这段代码来解决这个问题:
function Test-IsInsideContainer {
if( ($env:UserName -eq "ContainerAdministrator") -and ($env:UserDomain -eq "User Manager") ) {
$true
}
else {
$false
}
}
更新:另一种选择是检查服务cexecsvc 是否存在。互联网搜索并没有提供有关此服务的太多信息,但它的名称(容器执行代理)表明它仅存在于容器内部(我在 Win10 和 Server2016 Docker 主机上进行了一些快速测试验证了这一点)。所以也许这段代码符合你的要求(我是 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
}
下面会工作吗?
PS C:\> (Get-NetAdapter).Name -match "container"
True
从 Docker 17.06 开始,您可以使用 DNS 条目docker.for.mac.localhost和docker.for.mac.localhost来确定容器是在 mac 还是 windows 主机上运行。如果这些主机名都不能被 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 中需要类似的东西时分享。