检测进程是否在Windows容器内执行

这很简单。 我想用代码检测我的进程是否在Windows容器中运行。 有一些例子,但它们都是基于Linux的容器。

我正在寻找一些独特和明确的docker工具,可以用来作出一个安全的结论,无论是在一个容器托pipe的Windows操作系统内执行一个进程,否则不会。

我的首选语言是PowerShell,但如果有人指出如何检测,我将它移植到PowerShell。

新读者可以跳到标有“更新”的部分,其中包含接受的解决scheme。

在命令提示符下快速检查whoami显示,在容器内部使用的域和用户名的组合似乎是非常不寻常的。 所以我用这个代码来解决这个问题:

function Test-IsInsideContainer { if( ($env:UserName -eq "ContainerAdministrator") -and ($env:UserDomain -eq "User Manager") ) { $true } else { $false } } 

更新:另一个选项是检查服务cexecsvc是否存在。 一个互联网search没有得到有关这个服务的许多信息,但它的名字(Container Execution Agent)暗示它只存在于容器内部(我通过在Win10和Server2016 Docker-host上的一些快速testing进行了validation)。 所以也许这个代码符合你的要求(我是Powershell的新手):

 function Test-IsInsideContainer { $foundService = Get-Service -Name cexecsvc -ErrorAction SilentlyContinue if( $foundService -eq $null ) { $false } else { $true } } 

从Docker 17.06开始,您可以使用DNS条目docker.for.mac.localhostdocker.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中需要类似的东西时请分享。

下面会工作吗? PS C:\> (Get-NetAdapter).Name -match "container" True