Kubernetes Jobspec传递Json参数:为什么这是无效的Yaml以及如何修复?
我正在尝试运行调用python应用程序的作业,这些应用程序使用字典作为参数 例如,在本地运行它可能如下所示:Kubernetes Jobspec传递Json参数:为什么这是无效的Yaml以及如何修复?,json,kubernetes,yaml,Json,Kubernetes,Yaml,我正在尝试运行调用python应用程序的作业,这些应用程序使用字典作为参数 例如,在本地运行它可能如下所示: python3 examples/test.py '{"school":"EFG", "standard": "2", "name": "abc", "city": "miami"}' 因此,在我的工作规范中,我试图做到: c
python3 examples/test.py '{"school":"EFG", "standard": "2", "name": "abc", "city": "miami"}'
因此,在我的工作规范中,我试图做到:
command: ["/bin/bash","-c"]
args: ["python3 examples/test.py '{"school":"EFG", "standard": "2", "name": "abc", "city": "miami"}'"]
但是,我得到一个yaml错误:
error: error parsing job.yaml.tmpl: error converting YAML to JSON: yaml: line 18: could not find expected ':'
我在yaml lint中看到它是无效的。我成功通过yaml验证的唯一方法是转义每个报价,这对于用户将运行的数百个作业来说是不可伸缩的
args:
- "python3 examples/test.py '{\"school\":\"hello\", \"standard\": \"5\"}'"
为什么这不是有效的yaml?我如何做到这一点而不需要转义用户传入的给定词典中的每个引号?如果没有代码,很难复制您的设置,但是下面的示例应该适合您。在Kubernetes文档中,您可以找到所有命令都应该
包装的信息
在某些情况下,您需要在shell中运行命令。例如,您的命令可能由多个管道连接在一起的命令组成,也可能是一个shell脚本。要在shell中运行命令,请将其包装
下面是默认语法
command: ["/bin/sh","-c"]
args: ["command one; command two && command three"]
我对你的命令做了一点修改,并继续验证,都通过了
在命令中仅包含/bin/bash
的示例:
command:
- /bin/bash
args:
- "-c"
- "python3 examples/test.py '{\"school\":\"EFG\", \"standard\": \"2\", \"name\": \"abc\", \"city\": \"miami\"}'\"]"
or
command: ["/bin/bash"]
args: ["-c", "python3 examples/test.py", '{"school":"EFG", "standard": "2", "name": "abc", "city": "miami"}']
command:
- /bin/bash
- "-c"
args:
- "python3 examples/test.py"
- "{\"school\":\"EFG\", \"standard\": \"2\", \"name\": \"abc\", \"city\": \"miami\"}"
or
command: ["/bin/bash", "-c"]
args: ["python3 examples/test.py", '{"school":"EFG", "standard": "2", "name": "abc", "city": "miami"}']
在命令中使用/bin/bash
和-c
的示例:
command:
- /bin/bash
args:
- "-c"
- "python3 examples/test.py '{\"school\":\"EFG\", \"standard\": \"2\", \"name\": \"abc\", \"city\": \"miami\"}'\"]"
or
command: ["/bin/bash"]
args: ["-c", "python3 examples/test.py", '{"school":"EFG", "standard": "2", "name": "abc", "city": "miami"}']
command:
- /bin/bash
- "-c"
args:
- "python3 examples/test.py"
- "{\"school\":\"EFG\", \"standard\": \"2\", \"name\": \"abc\", \"city\": \"miami\"}"
or
command: ["/bin/bash", "-c"]
args: ["python3 examples/test.py", '{"school":"EFG", "standard": "2", "name": "abc", "city": "miami"}']
此外,关于在spec
中运行多个kubernetes命令,还有一个问题。你可以找到它
让我知道这是否对你有用。@Howard_Roark这样做吗?不,我不这么认为。目标是不要逃避任何引用。使用将json分离为单独参数的示例似乎会导致python程序在没有任何参数的情况下运行。ie-似乎python3 examples/test.py
在没有json传递给它的情况下被自己调用了。根据上面的评论,我测试了这两个想法:args:[“-c”,“python3 examples/test.py”,“school”:“EFG”,“standard”:“2”,“name”:“abc”,“city”:“miami”}]
args:[“python3 examples/test.py”,“py”{“school:“EFG”,“standard:“2”,“name:“abc”,“city:“miami”}']
可能是不同的方法,比如使用ConfigMap
,在文本块标量中嵌入JSON?类似的内容已经在本文中提到过。