很简单。 我想用代码检测我的进程是否在 windows 容器内运行。有一些例子,但它们都是基于Linux的容器。
我正在寻找一个独特且明确的docker东西,可用于确定进程是否在容器托管的Windows操作系统内执行,而不是其他方式。
我的首选语言是PowerShell,但如果有人指出如何检测,我会将其移植到PowerShell。
答案 0 :(得分:5)
新读者可以跳到标有“更新”的部分,其中包含已接受的解决方案。
在命令提示符下使用 whoami 快速检查显示容器内使用的域和用户名的组合似乎相当不寻常。所以我使用这段代码来解决问题:
function Test-IsInsideContainer {
if( ($env:UserName -eq "ContainerAdministrator") -and ($env:UserDomain -eq "User Manager") ) {
$true
}
else {
$false
}
}
更新:另一个选项是检查服务 cexecsvc 是否存在。互联网搜索并未提供有关此服务的大量信息,但其名称(Container Execution Agent)表明它只存在于容器内部(我在Win10和Server2016 Docker主机上进行了一些快速测试验证)。 所以也许这段代码符合你的要求(我是Powershell的新手):
function Test-IsInsideContainer {
$foundService = Get-Service -Name cexecsvc -ErrorAction SilentlyContinue
if( $foundService -eq $null ) {
$false
}
else {
$true
}
}
答案 1 :(得分:0)
从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中需要这样的内容时共享。
答案 2 :(得分:0)
" ContainerType" HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control。下的注册表值。
所以:
function Test-IsInsideContainer {
$containerType = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control").ContainerType
$containerType -ne $null
}
答案 3 :(得分:-1)
下面会工作吗?
PS C:\> (Get-NetAdapter).Name -match "container"
True