gpt4 book ai didi

azure - 将 PowerShell 模块安装到 docker 容器后,无法使用来自 PowerShell 模块的命令(在主机上同样有效)

转载 作者:行者123 更新时间:2023-12-03 03:43:37 25 4
gpt4 key购买 nike

Docker 容器 PowerShell 在安装和使用 (Azure) 模块时的行为与主机不同

我需要在 Windows docker 容器内进行各种 Azure PowerShell 事件,因为 Octopus Cloud 要求我在该上下文中运行我的工作线程。他们的标准脚本步骤似乎不支持这一点,建议我使用 docker 容器来创建预构建的 PowerShell 上下文。

在我的 win 10 机器上安装这些模块并运行脚本工作正常

我可以安装这些模块(进行一些调整),但它们包含的命令似乎不可用。我更改了模块路径,更改了用户上下文,设置了执行策略,导入了模块,但似乎没有任何效果。下面显示了一个示例,其中模块已安装(使用 Get-InstalledModule)但使用该命令失败,请注意,使用 Get-InstalledModule -Name 时该模块不会显示已安装。仅使用 Connect-AzAccount 连接时出现类似错误。

下图显示 (a) 该模块已安装 (b) 该模块的命令失败 (c) 该模块无法从安装模块位置获得。 enter image description here enter image description here

使用同一容器进行复制

  1. 从我的Docker Hub public repo下载docker镜像使用标签 windowsV2。 “docker pull mariusvrstr/azure-powershell-manager:windowsV2”
  2. 从 Az.Accounts、Az.KeyVault 运行命令,例如Connect-AzAccount 或 Get-AzKeyVaultCertificate -VaultName $vault -Name $certkey(不需要变量来执行某些操作,只需要识别命令即可)

使用基础容器进行复制

  1. 使用 Windows PowerShell images 中的 nanoserver-1909 标签下载并启动实例.
  2. 安装一些先决条件

Set-PSRepository -Name 'PSGallery' -InstallationPolicy TrustedSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser[Net.ServicePointManager]::SecurityProtocol =[Net.SecurityProtocolType]::Tls12

  • 安装所需的 PowerShell Azure 模块
  • Install-Module Az.Accounts -AllowClobber -SkipPublisherCheck -Scope CurrentUserInstall-Module Az.KeyVault -AllowClobber -SkipPublisherCheck -Scope CurrentUserInstall-Module -Name Az -AllowClobber -Scope CurrentUser

  • 从 Az.Accounts、Az.KeyVault 运行命令,例如Connect-AzAccount 或 Get-AzKeyVaultCertificate -VaultName $vault -Name $certkey (不需要变量,只需识别命令)
  • 用于检查证书过期的示例脚本,但细节并不重要。这是在本地工作的问题是即使安装模块后也找不到特定于 Azure 的命令。

    param ($appId, $secret, $tenant, $vault, $certkey, $expiryDays)

    $pass = ConvertTo-SecureString $secret -AsPlainText -Force
    $isCertificateHealthy = $false

    # Ensure the correct Azure module in PowerShell is installed
    $azAccountsInstalled = Get-InstalledModule Az.Accounts
    if( ! $azAccountsInstalled) {
    Install-Module Az.Accounts -AllowClobber -a
    }
    else{
    Write-Host "Az.Accounts already present" -ForegroundColor Yellow
    }
    $azCertificateInstalled = Get-InstalledModule Az.KeyVault
    if( ! $azCertificateInstalled) {
    Install-Module Az.KeyVault -a
    }
    else{
    Write-Host "Az.KeyVault already present" -ForegroundColor Yellow
    }

    $cred = New-Object System.Management.Automation.PSCredential($appId,$pass)
    Connect-AzAccount -ServicePrincipal -Credential $cred -Tenant $tenant

    $cert = Get-AzKeyVaultCertificate -VaultName $vault -Name $certkey

    $expiryDate = $cert.Expires
    Write-Host "Certificate expiry: [$expiryDate]"

    $daysToExpire = [math]::Ceiling(($expiryDate-(Get-Date)).TotalDays)
    Write-Host "Days to expiry: [$daysToExpire]"

    if ($daysToExpire -ge $expiryDays) {
    $isCertificateHealthy = $true
    }

    if ($isCertificateHealthy) {
    Write-Host "Certificate is healthy"
    } else {
    Write-Host "Warning! Certificate is not healthy"
    }

    任何帮助将不胜感激,我对 Docker 相当陌生,并且该功能在主机上工作,因此如果我在问题的那个空间中忽略了某些内容,我不会感到惊讶。我已经运行了 octopus 云项目并配置为使用它,只需要在容器上提供命令即可。

    最佳答案

    @Svyatoslav Pidgorny致敬,感谢 AllUsers 完成了这个技巧,但值得用它来解压一些上下文。

    • Windows 镜像默认使用 ContainerAdministrator 用户提供,而 NanoServer 则默认使用 ContainerUser 用户提供
    • 在 Octopus 上解决 PowerShell 脚本问题的一种更快的方法是找到我的工作人员正在执行的主机并在其上安装这些模块(尝试过,效果很好)

    为了获得运行此功能的完整解决方案,我做了:

    docker run -it --user ContainerAdministrator --dns="8.8.8.8"  mcr.microsoft.com/powershell:nanoserver-1909

    Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted
    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

    Install-Module Az.Accounts -AllowClobber -SkipPublisherCheck -Scope AllUsers
    Install-Module Az.KeyVault -AllowClobber -SkipPublisherCheck -Scope AllUsers
    Install-Module -Name Az -AllowClobber -SkipPublisherCheck -Scope AllUsers

    之后,您需要提交容器并将其推送到 Docker Hub。

    关于azure - 将 PowerShell 模块安装到 docker 容器后,无法使用来自 PowerShell 模块的命令(在主机上同样有效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70053368/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com