根据the docs,我需要在运行容器时运行以下PShell脚本,以便访问AWS IAM角色:
$gateway = (Get-WMIObject -Class Win32_IP4RouteTable | Where { $_.Destination -eq '0.0.0.0' -and $_.Mask -eq '0.0.0.0' } | Sort-Object Metric1 | Select NextHop).NextHop
$ifIndex = (Get-NetAdapter -InterfaceDescription "Hyper-V Virtual Ethernet*" | Sort-Object | Select ifIndex).ifIndex
New-NetRoute -DestinationPrefix 169.254.170.2/32 -InterfaceIndex $ifIndex -NextHop $gateway
然而它引发了一个例外:
Get-WMIObject:术语“Get-WMIObject”未被识别为名称 cmdlet,函数,脚本文件或可操作程序。检查 拼写名称,或者如果包含路径,请验证路径 是正确的,然后再试一次。
一些谷歌搜索似乎表明cmdlet已被Get-CimInstance
取代,这确实似乎至少进展到脚本中的第3行,但随后:
New-NetRoute:无法在参数'InterfaceIndex'上处理参数转换。无法将“System.Object []”类型的“System.Object []”值转换为“System.UInt32”类型。
$ifIndex
的值是数组[7,19]
。
我的Dockerfile:
FROM microsoft/dotnet:2.0-sdk AS build-env
WORKDIR /app
COPY ./ ./
RUN dotnet publish project/project.csproj -c Release -r win-x64 -o out
FROM microsoft/nanoserver:sac2016
WORKDIR /app
COPY --from=build-env /app/project/out ./
COPY --from=build-env /app/startProject.ps1 ./
ENTRYPOINT ["powershell", ".\\startProject.ps1"]
startProject.ps1的完整内容:
$gateway = (Get-CimInstance -Class Win32_IP4RouteTable | Where-Object { $_.Destination -eq '0.0.0.0' -and $_.Mask -eq '0.0.0.0' } | Sort-Object Metric1 | Select-Object NextHop).NextHop
$ifIndex = (Get-NetAdapter -InterfaceDescription "Hyper-V Virtual Ethernet*" | Sort-Object | Select-Object ifIndex).ifIndex
New-NetRoute -DestinationPrefix 169.254.170.2/32 -InterfaceIndex $ifIndex -NextHop $gateway
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
Start-Process "$scriptDir\Project.exe" -Wait
修改
实际上我似乎说得太早了 - 使用Get-CimInstance
会返回错误:
Get-CimInstance:无效的课程
这似乎表明找不到Win32_IP4RouteTable