#kubernetes #yaml #kubectl
#kubernetes #yaml #kubectl
Вопрос:
Вот упрощенная версия конфигурации YAML задания kubernetes, которую я обычно использую:
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
template:
spec:
containers:
- name: mycontainer
image: me/mycontainer:latest
command: ["bash", "-c"]
args:
- python -u myscript.py
--param1 abc
--param2 xyz
Приведенное выше отлично работает, его легко поддерживать и читать. Но теперь одному из моих параметров требуется немного уменьшенного YAML:
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
template:
spec:
containers:
- name: mycontainer
image: me/mycontainer:latest
command: ["bash", "-c"]
args:
- python -u myscript.py
--param_minified_yaml "{key: value}"
Этот бит встроенного уменьшенного yaml анализируется kubectl
и вызывает: error: error parsing STDIN: error converting YAML to JSON: yaml: line 26: mapping values are not allowed in this context
Как можно экранировать встроенный yaml args:
таким образом, чтобы он передавался как чисто текстовый аргумент?
Ответ №1:
Если уменьшенный yaml (или строка аргументов в целом) не содержит одинарных кавычек, вы можете заключить в них всю командную строку:
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
template:
spec:
containers:
- name: mycontainer
image: me/mycontainer:latest
command: ["bash", "-c"]
args:
- 'python -u myscript.py
--param_minified_yaml "{key: value}"'
Если строка аргументов содержит одинарные кавычки includes, строка аргументов может быть передана как многострочная строка YAML:
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
template:
spec:
containers:
- name: mycontainer
image: me/mycontainer:latest
command: ["bash", "-c"]
args:
- >-
python -u myscript.py
--param_minified_yaml "{key: 'value'}"
Комментарии:
1. Внимательно следите за отступом текста блока, добавление дополнительных пробелов к тому
--param_minified_yaml
, что было в исходном примере, добавит символы новой строки. Мне потребовалось несколько минут, чтобы разобраться. Кроме этого, это отлично работает!
Ответ №2:
Здесь можно использовать скаляр блока:
args:
- >
python -u myscript.py
--param_minified_yaml "{key: value}"
Попробуйте различные скалярные форматы в валидаторе или конвертере yaml, чтобы узнать об их различиях.
Ответ №3:
bash -c
Оболочка помещает всю фактическую команду в один аргумент, а затем приводит к проблемам с экранированием и цитированием. Если вам действительно не нужно вызывать оболочку (возможно, для интерполяции переменных среды), лучше удалить ее. Тогда command:
это список слов; вы несете ответственность за разбиение команды на отдельные слова, но, наоборот, вы можете использовать любой допустимый синтаксис YAML для каждого отдельного слова.
Итак, здесь я мог бы написать:
command:
- python
- -u
- myscript.py
- --param_minified_yaml
- '{key: value}' # in quotes, so it is a YAML string
Любой из синтаксических вариантов, предложенных в других ответах, работает, и вы можете смешивать и сопоставлять для каждого аргумента.
command:
- ...
- --param_minified_yaml
- >- # block scalar syntax, again makes a string
{key: value}