Как запустить контейнер с kubectl и получить код выхода обратно? без кубектл exec - PullRequest
1 голос
/ 21 апреля 2020

Мой инструмент CI использует жизненные циклы, поэтому, если развертывания Dev работают, он переходит к QA.

У меня есть тестовый контейнер от конца до конца, который я хочу запустить в kubernetes, но как мне получить код выхода из контейнер?

Могу ли я каким-то образом запустить контейнер и получить код выхода в одной команде?

kubectl run -it, похоже, не получает код выхода и есть некоторые дополнительные вещи, которые нужно сказать после того, как контейнер сделан.

Ответы [ 4 ]

1 голос
/ 21 апреля 2020

Чтобы получить код выхода из контейнера (контейнера), вы можете получить информацию о пакете с помощью команды:

kubectl get pod termination-demo --output=yaml

Вывод:

apiVersion: v1
kind: Pod
...
    lastState:
      terminated:
        containerID: ...
        exitCode: 0
        finishedAt: ...
        message: |
          Sleep expired
        ...

Чтобы узнать больше, вы можете проверьте документацию .

Чтобы упростить работу с sh, вы можете выполнить:

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}"
0 голосов
/ 29 апреля 2020

Этот способ упоминался мВтней ранее, поэтому я просто добавил некоторые дополнительные детали:

Таким образом, вы можете вернуть код выхода 0-255 (после 255 он начинается снова 256 == 0) из стручка.

-it и --restart=Never являются обязательными, --rm является необязательным, но полезно для удаления неисправных модулей.
--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
0 голосов
/ 21 апреля 2020

Вы можете передать вывод kubectl get в jq, который может проанализировать json и распечатать код выхода, вы можете пропустить -c container_name, если присутствует один контейнер.

kubectl get pod pod_name -c container_name-n namespace -ojson | jq .status.containerStatuses[].state.terminated.exitCode
0 голосов
/ 21 апреля 2020
kubectl get po pod_name -ojson | jq .status.containerStatuses[].state.terminated.exitCode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...