我有一个perl命令,需要将其传递给kubernetes作业。命令计算pi的值并将其打印到2000个位置。
perl -Mbignum = bpi -wle'print bpi(2000)'
我已将命令传递到作业yaml文件,如下所示。通过kubectl,yaml文件成功创建作业并打印pi的值。
apiVersion: batch/v1
kind: Job
metadata:
name: pi-job
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
当我尝试使用以下命令语法时,它给了我错误。您能否告诉我以下命令synax不正确的原因?
command: ["perl", "-Mbignum=bpi", "-wle", "'print bpi(2000)'"] # placed inside single quote
command: ["perl", "-Mbignum=bpi", "-wle", "print", " bpi(2000)"] # print splitted in two quotes.
command: ["perl", "-Mbignum=bpi", "-wle", "print", "bpi(2000)"] # print splitted in two quotes.
同样,当我在单引号中传递完整命令时,也会给我错误。
command: ["perl -Mbignum=bpi -wle print bpi(2000)"] # complete command in single quotes.
最佳答案
command: ["perl -Mbignum=bpi -wle print bpi(2000)"] # complete
command in single quotes.command:
键要求您将数组作为参数传递给(与this示例进行比较)。您可以用两种等效形式指定一个数组:
在单行中,使用方括号[]
:
---
items: [ 1, 2, 3, 4, 5 ]
names: [ "one", "two", "three", "four" ]
并以多行方式:
---
items:
- 1
- 2
- 3
- 4
- 5
names:
- "one"
- "two"
- "three"
- "four"
您可以同时使用双引号(双引号)和单引号(引号)引号,因此下面的示例也是正确的,并且可以使用:command: ['perl', '-Mbignum=bpi', '-wle', 'print bpi(2000)']
但是,您不能同时使用两者。我不知道将"
放在那里会达到什么目的,但是这种语法没有任何意义,并且完全不正确。
您还可能会问为什么在'
成功运行的同时不能在"'print bpi(2000)'"
中运行'echo bla'
,却给您想要的结果。
请注意,当以这种方式在 kubernetes 中提供bash
时,只有数组的第一个元素是实际的echo bla
(在command
中搜索的可执行文件),其他随后的元素是其参数。请记住,您的下两个示例也没有任何意义,因为分别提供的“print”和“bpi(2000)”都不是有效的参数:
command: ["perl", "-Mbignum=bpi", "-wle", "print", " bpi(2000)"] # print splitted in two quotes.
command: ["perl", "-Mbignum=bpi", "-wle", "print", "bpi(2000)"] # print splitted in two quotes.
为了完全理解此命令的作用,我们需要深入研究基本的command
文档。我只保留了示例中使用的与之相关的那些选项:$ perl --help
Usage: perl [switches] [--] [programfile] [arguments]
-e program one line of program (several -e's allowed, omit programfile)
-l[octal] enable line ending processing, specifies line terminator
-[mM][-]module execute "use/no module..." before executing program
-w enable many useful warnings
Run 'perldoc perl' for more help with Perl.
现在,让我们逐步分析命令:["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
跟随主命令$PATH
的数组的每个元素都是一个单独的实体,作为主命令的自变量,其标志或最近提供的标志的自变量传递,根据文档要求,应将其提供给非常具体的形式。
在我们的perl
标志集中,"perl"
选项至关重要,因为它必须后面跟随特定的参数: -e program one line of program (several -e's allowed, omit programfile)
在我们的示例中是:print bpi(2000)
我想再次强调。数组的每个元素都被视为一个单独的实体。通过将其分为两个单独的元素(例如-wle
或e
),您仅使用"print", " bpi(2000)"
参数提供"print", "bpi(2000)"
,这没有任何意义,因为它需要非常具体的命令告诉它应该打印什么。就像您在bash shell中运行一样:perl -Mbignum=bpi -wle 'print' 'bpi(2000)'
这将导致来自perl解释器的以下错误:Use of uninitialized value $_ in print at -e line 1.
最后,当您运行最后一个示例时:
您将获得非常详细的消息,说明为什么它在perl -e
事件(print
)中不起作用:Error: failed to start container "pi": Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"perl -Mbignum=bpi -wle print bpi(2000)\": executable file not found in $PATH": unknown
它基本上试图在$ PATH中找到一个名为Pod
的可执行文件,这当然是做不到的。
如果您想熟悉在 kubernetes 中为kubectl describe pod pi
定义"perl -Mbignum=bpi -wle print bpi(2000)"
及其command
的不同方法,建议您阅读kubernetes官方文档中的this部分。
关于kubernetes - 命令传递给Kubernetes Job and Pod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60061241/