如何获取Kubernetes容器中运行应用的具体退出码?
问题
我尝试获取Kubernetes集群中运行应用的退出码,Pod状态显示为Error,但我需要获取myscript.ps1返回的具体退出码值。目前仅能在Pod日志中看到该退出码(如示例中的10),但无法通过容器退出码获取;使用kubectl run命令仅能得到布尔状态(True/False),而非具体数值。
相关配置及脚本如下:
Dockerfile
# 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.ps1
# 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
执行命令示例
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 Exit with Exit Code pod default/myjob5 terminated (Error)
执行后$?输出为False,请问如何获取具体的退出码值?
解决方案
方法1:通过kubectl describe查看容器退出码
Pod终止后,执行以下命令查看Pod详情,在Container Statuses部分的Exit Code字段可直接获取具体数值:
kubectl describe pod <pod-name>
针对示例中的myjob5,执行kubectl describe pod myjob5后,会输出类似内容:
... Container Statuses: Container ID: docker://<container-id> Image: myacr.azurecr.io/myapp:v1 Image ID: docker-pullable://myacr.azurecr.io/myapp@sha256:<hash> Last State: Terminated Reason: Error Exit Code: 10 Started: <时间> Finished: <时间> ...
方法2:用kubectl jsonpath直接提取退出码
如果需要直接获取数值用于脚本,可通过jsonpath过滤输出,一步得到结果:
kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[0].state.terminated.exitCode}'
该命令会直接返回退出码数值(如示例中的10)。
方法3:调整PowerShell脚本确保退出码正确传递
当前脚本使用Invoke-Expression执行子脚本和exe,可能导致退出码未正确传递。可修改脚本,直接调用命令而非Invoke-Expression,确保$LASTEXITCODE能准确捕获子进程退出码:
# Run script 1 & "C:\scripts\myscript1.ps1" if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } # Run script 2 & "C:\scripts\myscript2.ps1" if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } # Invoke exe & "C:\app\MyApp.exe" $exitCode = $LASTEXITCODE Write-Host $exitCode Write-Host "Exit with Exit Code" exit $exitCode
修改后,容器退出码会与脚本的$LASTEXITCODE完全一致,避免因Invoke-Expression导致的退出码丢失问题。
方法4:使用Job资源替代kubectl run
如果是一次性任务,建议使用Kubernetes Job资源。任务完成后,可通过以下命令获取Pod的退出码:
kubectl get job <job-name> -o jsonpath='{.status.containerStatuses[0].state.terminated.exitCode}'
内容的提问来源于stack exchange,提问作者Imran Khan
相关产品推荐
相关产品推荐

