检测进程是否在Windows容器

时间:2017-03-24 15:00:29

标签: powershell docker windows-container

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

我正在寻找一个独特且明确的docker东西,可用于确定进程是否在容器托管的Windows操作系统内执行,而不是其他方式。

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

4 个答案:

答案 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