kubernetes выполняет команду в env. varible с eval

#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:

3.1.2.2 Одинарные кавычки

Заключая символы в одинарные кавычки ( ' ), сохраняется буквальное значение каждого символа в кавычках. Между одиночными кавычками может не быть одинарной кавычки, даже если перед ними обратная косая черта.

Подводя итог, вот как должна выглядеть ваша команда:

 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 $?"