網頁

解除Docker Engine on Windows在Terminal需要Admin Mode的限制

解除Docker Engine on Windows在Terminal需要Admin Mode的限制

由於 Docker Desktop 的收費政策的關係,公司電腦不能裝 Docker Desktop 很久了,但某些需求,例如 Windows Container,還是用 Docker 來做比較方便。雖然就授權而言不能安裝 Docker Desktop,但授權沒限制單獨使用 Docker Engine。對於我們只下 Docker CLI 而言,Docker Engine on Windows 已經能完全滿足我們的需求了。

Admin Mode 的限制

在使用 Docker Engine on Windows 上有個很麻煩的地方,預設情況下,你只能開啟 Admin Mode 的 Terminal 來下 Docker CLI 進行操作。例如,在非 Admin Mode 執行 Docker CLI 都會出現類似的錯誤訊息。

permission denied while trying to connect to the docker API at npipe:////./pipe/docker_engine

在多方研究之後,終於找到解決方案,你只要執行以下指令之後,就能在平常的 Terminal 模式下執行 Docker CLI。

#Requires -Version 5.0

<#
.SYNOPSIS
    設定指定帳戶對 Docker Engine 命名管道的存取權限
    
.DESCRIPTION
    此函數會為指定的使用者帳戶授予 Docker Engine 命名管道的完全控制權限
    適用於需要給予特定使用者存取 Docker 的情境
    
.PARAMETER account
    要授予權限的使用者帳戶名稱
    
.EXAMPLE
    Set-DockerEngineAccess -account "brucechen"
    授予 account 帳戶完全控制 Docker Engine 的權限
    
.NOTES
    需要管理員權限執行
    僅支援 PowerShell 5.0 或更高版本
#>
function Set-DockerEngineAccess {
    param(
        [Parameter(Mandatory=$true)]
        [string]$account
    )
    
    # Docker Engine 命名管道路徑
    $npipe = "\\.\pipe\docker_engine"
    # 取得命名管道的目錄資訊
    $dInfo = New-Object "System.IO.DirectoryInfo" -ArgumentList $npipe
    # 取得目前的存取控制設定
    $dSec = $dInfo.GetAccessControl()
    # 定義完全控制權限
    $fullControl = [System.Security.AccessControl.FileSystemRights]::FullControl
    # 定義允許存取類型
    $allow = [System.Security.AccessControl.AccessControlType]::Allow
    # 建立存取規則
    $rule = New-Object "System.Security.AccessControl.FileSystemAccessRule" -ArgumentList $account,$fullControl,$allow
    # 新增存取規則
    $dSec.AddAccessRule($rule)
    # 套用新的存取控制設定
    $dInfo.SetAccessControl($dSec)
}

# 使用範例:
# Set-DockerEngineAccess -account "brucechen"

注意:此指令碼只能在 PowerShell 5.x 執行。無法在 PowerShell Core 執行。

這裡注意一下,我在網域環境下的 Account 不能用 tw\brucechen 去設定,應該用 brucechen 才對。你也可以用 PowerShell AD 模組的指令 get-aduser tw\brucechenget-aduser brucechen 來驗證,有加 tw\ 反而會出錯。

參考:

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。