如何使用 kubectl 启动容器并取回退出代码?没有 kubectl exec
How to start container with kubectl and get exit code back? without kubectl exec
我的 CI 工具使用生命周期,因此如果 Dev 部署有效,它就会进入 QA。
我有一个端到端测试容器,我想在 kubernetes 中 运行,但是我如何从容器中获取退出代码?
我能以某种方式 运行 容器并在一条命令中取回退出代码吗?
kubectl run -it
似乎没有得到退出代码,容器完成后还有一些额外的事情要说。
kubectl get po pod_name -ojson | jq .status.containerStatuses[].state.terminated.exitCode
要从 Pod(容器)获取退出代码,您可以使用以下命令获取 Pod 详细信息:
kubectl get pod termination-demo --output=yaml
输出:
apiVersion: v1
kind: Pod
...
lastState:
terminated:
containerID: ...
exitCode: 0
finishedAt: ...
message: |
Sleep expired
...
要了解更多,您可以查看documentation.
如您所愿,让事情变得更简单 运行:
kubectl get pod busybox-term -ojson | jq .status.containerStatuses[].lastState.terminated.exitCode
或者如果你不想安装jq
,你可以运行:
kubectl get pod busybox-term --output="jsonpath={.status.containerStatuses[].lastState.terminated.exitCode}"
您可以将 kubectl get
的输出通过管道传递给 jq,它可以解析 json 并打印退出代码,如果存在单个容器,您可以跳过 -c container_name
。
kubectl get pod pod_name -c container_name-n namespace -ojson | jq .status.containerStatuses[].state.terminated.exitCode
之前mWatney提到过这种方式,所以我在这里补充一些细节:
通过这种方式,您可以从 Pod return 退出代码 0-255(在 255 之后重新开始,256==0)。
-it
和 --restart=Never
是必需的,--rm
是可选的,但对于删除失败的 pods.
很有用
--restart=Never
告诉生成器创建一个 Pod 对象而不是 Deployment。
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 0"
pod "exitcode" deleted
$ echo $?
0
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 1"
pod "exitcode" deleted
pod default/exitcode terminated (Error)
$ echo $?
1
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 8"
pod "exitcode" deleted
pod default/exitcode terminated (Error)
$ echo $?
8
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 250"
pod "exitcode" deleted
pod default/exitcode terminated (Error)
$ echo $?
250
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 255"
pod "exitcode" deleted
pod default/exitcode terminated (Error)
$ echo $?
255
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 256"
pod "exitcode" deleted
$ echo $?
0
# exit code can also be assigned to a variable
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 255" ; a=$? && echo $a
pod "exitcode" deleted
pod default/exitcode terminated (Error)
255
LoganMzz 更新:
$ kubectl run -it --rm --image=busybox --restart=Never foobar -- ash -c 'exit 10'; echo rc=$?
pod "foobar" deleted
pod default/foobar terminated (Error)
rc=10
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:47:41Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:39:24Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
10.10.0.21 Ready master 2d1h v1.18.5 10.10.0.21 <none> Ubuntu 16.04.6 LTS 4.4.0-184-generic docker://18.9.7
10.10.0.22 Ready <none> 2d1h v1.18.5 10.10.0.22 <none> Ubuntu 16.04.6 LTS 4.4.0-184-generic docker://18.9.7
我的 CI 工具使用生命周期,因此如果 Dev 部署有效,它就会进入 QA。
我有一个端到端测试容器,我想在 kubernetes 中 运行,但是我如何从容器中获取退出代码?
我能以某种方式 运行 容器并在一条命令中取回退出代码吗?
kubectl run -it
似乎没有得到退出代码,容器完成后还有一些额外的事情要说。
kubectl get po pod_name -ojson | jq .status.containerStatuses[].state.terminated.exitCode
要从 Pod(容器)获取退出代码,您可以使用以下命令获取 Pod 详细信息:
kubectl get pod termination-demo --output=yaml
输出:
apiVersion: v1
kind: Pod
...
lastState:
terminated:
containerID: ...
exitCode: 0
finishedAt: ...
message: |
Sleep expired
...
要了解更多,您可以查看documentation.
如您所愿,让事情变得更简单 运行:
kubectl get pod busybox-term -ojson | jq .status.containerStatuses[].lastState.terminated.exitCode
或者如果你不想安装jq
,你可以运行:
kubectl get pod busybox-term --output="jsonpath={.status.containerStatuses[].lastState.terminated.exitCode}"
您可以将 kubectl get
的输出通过管道传递给 jq,它可以解析 json 并打印退出代码,如果存在单个容器,您可以跳过 -c container_name
。
kubectl get pod pod_name -c container_name-n namespace -ojson | jq .status.containerStatuses[].state.terminated.exitCode
之前mWatney提到过这种方式,所以我在这里补充一些细节:
通过这种方式,您可以从 Pod return 退出代码 0-255(在 255 之后重新开始,256==0)。
-it
和 --restart=Never
是必需的,--rm
是可选的,但对于删除失败的 pods.
很有用
--restart=Never
告诉生成器创建一个 Pod 对象而不是 Deployment。
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 0"
pod "exitcode" deleted
$ echo $?
0
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 1"
pod "exitcode" deleted
pod default/exitcode terminated (Error)
$ echo $?
1
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 8"
pod "exitcode" deleted
pod default/exitcode terminated (Error)
$ echo $?
8
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 250"
pod "exitcode" deleted
pod default/exitcode terminated (Error)
$ echo $?
250
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 255"
pod "exitcode" deleted
pod default/exitcode terminated (Error)
$ echo $?
255
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 256"
pod "exitcode" deleted
$ echo $?
0
# exit code can also be assigned to a variable
$ kubectl run -it --rm exitcode --image=nginx --restart=Never -- bash -c "exit 255" ; a=$? && echo $a
pod "exitcode" deleted
pod default/exitcode terminated (Error)
255
LoganMzz 更新:
$ kubectl run -it --rm --image=busybox --restart=Never foobar -- ash -c 'exit 10'; echo rc=$?
pod "foobar" deleted
pod default/foobar terminated (Error)
rc=10
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:47:41Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:39:24Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
10.10.0.21 Ready master 2d1h v1.18.5 10.10.0.21 <none> Ubuntu 16.04.6 LTS 4.4.0-184-generic docker://18.9.7
10.10.0.22 Ready <none> 2d1h v1.18.5 10.10.0.22 <none> Ubuntu 16.04.6 LTS 4.4.0-184-generic docker://18.9.7