Можете ли вы передать переменные окружения в kubectl exec без bash -c? - PullRequest
1 голос
/ 28 апреля 2019

У меня есть скрипт в модуле script01, который может принимать параметры.Я запускаю сценарий следующим образом:

POD=<pod name>
runScript="kubectl -n nmspc exec $POD -- script01"
$runScript --command "do stuff"

Причина, по которой я запускаю его таким образом, заключается в том, что у меня нет доступа к созданию сценария на локальном компьютере, но у меня есть доступ к сценарию напорт назначения

Проблема в том, что я хочу передать IP хост-машины модулю и хотел сделать это с помощью переменной окружения.Я пытался использовать bash -c для передачи параметров, но при вызове скрипта через переменную он не добавляет параметры.

runScript="kubectl -n nmspc exec $POD -- bash -c \"export curIP=123 && script01\""

, но он работает, если я запускаю его с $runScript --command "do stuff"

Как передать переменную окружения в модуль, но при этом иметь возможность вызывать скрипт через переменную?

1 Ответ

7 голосов
/ 29 апреля 2019

/usr/bin/env экспортирует значения, переданные в парах key=value, в среду любой программы, для которой она используется.

kubectl -n nmspc exec "$POD" -- env curIP=123 script01

Обратите внимание, что вы никогда не должны использовать $runScript илилюбое другое расширение без кавычек для вызова команды оболочки.См. BashFAQ # 50 - Я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу!


В качестве примеракак вы могли бы держать bash -c на месте, но ваша команда работала, рассмотрим:

runScript() {
  kubectl -n nmspc exec "$POD" -- bash -c 'export curIP=123 && script01 "$@"' _ "$@"
}

runScript --command "do stuff"

Здесь runScript - это функция , а не строкапеременная, и он явно передает весь список аргументов до kubectl.Аналогично, копия bash, запущенная kubectl, явно передает свой список аргументов (после $0 placeholder _) до script01, поэтому конечный результат - ваши аргументы, делающие этодо вашей окончательной программы.

...