2017-03-24 22 views
1

很簡單。 我想用代碼檢測我的進程是否在windows容器內運行。有一些例子,但它們都是基於Linux的容器。檢測進程是否在Windows容器內執行

我正在尋找一些獨特且顯式的docker,可以用來做出一個安全的結論,無論是在一個容器託管的Windows操作系統內執行一個進程而不是其他方式。

我的首選語言是PowerShell,但如果有人指出如何檢測,我會將它移植到PowerShell。

+0

這個問題肯定需要一些改進。你嘗試過什麼來實現你的目標?什麼是這些Linux的例子,你是什麼意思與Windows容器?看看標籤我想你想看看你的腳本是運行在Linux上還是在Windows泊塢窗圖像上。但它只是一個猜測...... – Clijsters

+0

感謝您的反饋,但我的觀點是,當搜索這個主題時,你只能得到Linux的特定答案。我正在尋找可以檢測一個cigs是否在容器內運行的方法。我沒有嘗試過任何東西,因爲我不知道從哪裏開始,因爲我找不到一個好的參考。出於這個原因,我的問題確實是「空洞的」。 –

回答

2

新讀者可以跳到標有「Update」的部分,其中包含接受的解決方案。

快速檢查與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 
    } 
} 
+0

這確實是一個可行的解決方案,但我仍然在尋找可能會導致衝突的值的獨立值。例如在亞馬遜,你可以嘗試一個特定的元數據端點,類似於@dominique在他自己的答案中所建議的。 –

+0

我已經用新選項更新了我的答案... –

+0

服務理念屬於獨特類別。我現在好奇這個服務是幹什麼的。我會做一些檢查並回來給你。我需要檢查這兩個納米和核心基地的圖像。現在謝謝你。 –

-1

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

+0

我要檢查一下,但我在想更強大的東西。建議只是檢查網絡適配器名稱,這可能會導致誤報,具體取決於適配器的名稱。是不是有更獨特和明確的是作爲碼頭標記的行爲? –

+0

我想你可以拼湊一堆東西來找出它是否在容器中。例如服務器服務將被停止,將有用戶稱爲ContainerAdmin等。把&放在每一個之間,如果全都是真的,那麼它實際上就是容器。記住整點是讓操作系統認爲它正在運行它自己的操作系統 –

+0

我想下面將提供99.9999%,你在容器內PS C:\>(invoke-webrequest http://172.17.208.1:2375/containers/json -usebasicparsing).Rawcontent -match $ env:computername' –

0

由於碼頭工人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這樣的事情請不要份額。

+0

'ping docker.for.win.localhost'在Windows容器上不起作用 –

相關問題