检测进程是否在 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.localhostdocker.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
}