#kubernetes #environment-variables #eval
#kubernetes #переменные среды #eval
Вопрос:
Я хотел бы выполнить команду в контейнере (пусть это будет ls), а затем прочитать код выхода с помощью echo $?
kubectl exec -ti mypod -- bash -c "ls; echo $?"
не работает, потому что он возвращает код выхода моей текущей оболочки, а не один из контейнера.
Итак, я попытался использовать eval для переменной env, которую я определил в своем манифесте :
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- container2
image: varunuppal/nonrootsudo
env:
- name: resultCmd
value: 'echo $?'
затем kubectl exec -ti mypod -- bash -c "ls;eval $resultCmd"
но команда eval ничего не возвращает.
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
Обратите внимание, что я могу запустить эти две команды внутри контейнера
kubectl exec -ti mypod bash
#ls;eval $resultCmd
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
**0**
Как я могу заставить это работать?
Заранее спасибо,
Ответ №1:
Это происходит потому, что вы используете двойные кавычки вместо одинарных. Одинарные кавычки ничего не заменят, но двойные кавычки заменят.
Из документации bash:
Заключая символы в одинарные кавычки (
'
), сохраняется буквальное значение каждого символа в кавычках. Между одиночными кавычками может не быть одинарной кавычки, даже если перед ними обратная косая черта.
Подводя итог, вот как должна выглядеть ваша команда:
kubectl exec -ti firstpod -- bash -c 'ls; echo $?'
Ответ №2:
Использование команды оболочки POSIX eval
в 99,999% случаев является неправильным. Даже если вы игнорируете присутствие Kubernetes в этом вопросе. Проблема в вашем вопросе заключается в том, что ваша kubectl
команда расширяет определение $resultCmd
в оболочке, в которой вы запустили kubectl
команду. В частности, из-за использования вами двойных кавычек. Эта интерактивная оболочка не знает определения $resultCmd
в вашем файле «манифеста». Так что оболочка ничего не заменяет $resultCmd
.
Ответ №3:
Спасибо Куртису Рейдеру и Томасу за ваши ответы.
Это также работает, когда я предшествую $? с обратной косой чертой :
kubectl exec -ti firstpod -- bash -c "ls; echo $?"