На низком уровне все команды Unix фактически выполняются как последовательность слов. Обычно оболочка разделяет командные строки на слова для вас, но в манифесте Kubernetes вы должны вручную указывать одно слово за раз.
В вашем примере опция Bourne shell sh -c
читает только следующее отдельное слово и выполняет его как команду, применяя обычные правила оболочки. Любые оставшиеся слова используются в качестве позиционных параметров, если в команде используются переменные типа $1
.
. Вы можете продемонстрировать это за пределами Kubernetes в своей локальной оболочке, используя кавычки, чтобы заставить оболочку разбивать слова так, как это необходимо. Вы хотите:
# Option one
'/bin/sh' '-c' 'echo foo' '&&' 'echo bar'
# Prints "foo"
# Option two
'/bin/sh' '-c' 'echo foo && echo bar'
# Prints "foo", "bar"
Одна хитрость, которая проявляется довольно часто, заключается в использовании скаляров блока YAML для записи одной строки в несколько строк, что дает что-то вроде скрипта оболочки но на самом деле это не так.
command: ['/bin/sh', '-c']
args: >-
python3 ./manage.py migrate
&&
python3 ./manage.py collectstatic --noinput