You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:37:37