我正在尝试从 kubernetes 集群中运行的应用程序退出。我可以看到 Pod 状态为“错误”,但我有兴趣获取确切的退出代码。
Docker 文件:
# getting base image
FROM mcr.microsoft.com/windows/servercore:ltsc2019
# Copy powershell scripts
COPY scripts/ scripts/
# copy app
COPY app/ app/
# run script
ENTRYPOINT ["powershell", "C:\\scripts\\myscript.ps1"]
myscript.sp1:
# Run script 1
Invoke-Expression "& `"C:\\scripts\\myscript1.ps1`" "
# Run script 2
Invoke-Expression "& `"C:\\scripts\\myscript2.ps1`" "
#Invoke exe
Invoke-Expression "& `"C:\app\MyApp.exe`" "
# Write Exit Code
Write-Host $LASTEXITCODE
Write-Host "Exit with Exit Code"
exit $LASTEXITCODE
出现错误时,我可以看到 pod 状态为“错误”,但我需要获取从 myscript.ps1 返回的确切退出代码。当我查看 Pod 日志时可以看到退出代码,但在容器退出代码中没有看到它。
我也尝试过这个如何使用 kubectl 启动容器并获取退出代码?没有 kubectl exec 但状态为 true 或 false
kubectl run myjob4 -it --restart=Never --image=myacr.azurecr.io/myapp:v1 --restart=Never --overrides='"{\"apiVersion\":\"v1\",\"spec\":{\"nodeSelector\":{\"kubernetes.azure.com/os-sku\":\"Windows2019\",\"kubernetes.io/os\":\"windows\"}}}"'
输出:
10 使用退出代码退出 pod 默认/myjob5 终止(错误)
$?
输出:
错误
如何获取退出代码 10(在本例中)而不是 false?
仅 PowerShell CLI
的
-File
参数(powershell.exe
对于 Windows PowerShell,pwsh
对于 PowerShell (Core) 7+) 通过 as 传递 脚本文件的退出代码-is,使用 -File
是调用脚本文件的正确方法。
powershell.exe
默认为 -Command
CLI 参数(而 pwsh
默认为 -File
),默认情况下仅报告 abstract 退出代码,即 0
如果最后一条语句执行成功,则 1
否则。有关详细信息,请参阅此答案。因此,请在 Dockerfile 中使用以下内容:
# run script
ENTRYPOINT ["powershell", "-File", "C:\\scripts\\myscript.ps1"]
两点旁白:
Invoke-Expression
(iex
) 一般应避免;除特殊情况外,请勿使用它来调用外部程序或 PowerShell 脚本/命令。
\
字符对于 PowerShell 来说没有特殊含义,因此您永远不需要将它们转义为 \\
(PowerShell 的转义字符是
`
,即所谓的反引号)。
# Alternatively, simply:
# C:\scripts\myscript1.ps1
& "C:\scripts\myscript1.ps1"
# Run script 2
& "C:\scripts\myscript2.ps1"
#Invoke exe
& "C:\app\MyApp.exe"
# ...
exit $LASTEXITCODE