带有 -c 参数 returns 的 Kubernetes /bin/bash - :无效选项
Kubernetes /bin/bash with -c argument returns - : invalid option
我的 values.yaml 中有这个定义,提供给 job.yaml
command: ["/bin/bash"]
args: ["-c", "cd /opt/nonrtric/ric-common/ansible/; cat group_vars/all"]
但是,在 pod 初始化后,我收到此错误:
/bin/bash: - : invalid option
如果我尝试这个语法:
command: ["/bin/sh", "-c"]
args:
- >
cd /opt/nonrtric/ric-common/ansible/ &&
cat group_vars/all
我收到此错误:Error: failed to start container "ric-register-avro": Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "/bin/sh -c": stat /bin/sh -c: no such file or directory: unknown
镜像中同时提供了sh和bash,为CentOS 7
job.yaml
---
apiVersion: batch/v1
kind: Job
metadata:
name: ric-register-avro
spec:
backoffLimit: 0
template:
spec:
containers:
- image: "{{ .Values.ric_register_avro_job.image }}"
name: "{{ .Values.ric_register_avro_job.name }}"
command: {{ .Values.ric_register_avro_job.containers.command }}
args: {{ .Values.ric_register_avro_job.containers.args }}
volumeMounts:
- name: all-file
mountPath: "/opt/nonrtric/ric-common/ansible/group_vars/"
readOnly: true
subPath: all
volumes:
- name: all-file
configMap:
name: ric-register-avro--configmap
restartPolicy: Never
values.yaml
global:
name: ric-register-avro
namespace: foo-bar
ric_register_avro_job:
name: ric-register-avro
all_file:
rest_api_url: http://10.230.227.13/foo
auth_username: foo
auth_password: bar
backoffLimit: 0
completions: 1
image: 10.0.0.1:5000/5gc/ric-app
containers:
name: ric-register-avro
command: ["/bin/bash"]
args: ["-c cd /opt/nonrtric/ric-common/ansible/; cat group_vars/all"]
restartPolicy: Never
我用这个:
command: ["/bin/sh"]
args: ["-c", "my-command"]
尝试这个简单的工作我没有问题:
apiVersion: batch/v1
kind: Job
metadata:
name: foo
spec:
template:
spec:
containers:
- name: foo
image: centos:7
command: ["/bin/sh"]
args: ["-c", "echo 'hello world'"]
restartPolicy: Never
在您的 Helm 图表中,您使用模板语法直接指定 command:
和 args:
command: {{ .Values.ric_register_avro_job.containers.command }}
args: {{ .Values.ric_register_avro_job.containers.args }}
但是,{{ ... }}
块的输出始终是一个字符串。如果模板中的值是其他类型,如列表,它将使用一些默认的 Go 规则转换为字符串,这在 Kubernetes 上下文中不是特别有用。
Helm 包含两个文档简单的转换函数 toJson
和 toYaml
,可以在此处提供帮助。有效的 JSON 也是有效的 YAML,因此一种简单的方法是将两部分都转换为 JSON
command: {{ toJson .Values.ric_register_avro_job.containers.command }}
args: {{ toJson .Values.ric_register_avro_job.containers.args }}
或者,如果您希望它看起来更像普通的 YAML,
command:
{{ .Values.ric_register_avro_job.containers.command | toYaml | indent 12 }}
args:
{{ .Values.ric_register_avro_job.containers.args | toYaml | indent 12 }}
或者,就此而言,如果您通过 Helm 值传递完整的容器描述,则足以
containers:
- name: ric_register_avro_job
{{ .Values.ric_register_avro_job.containers | toYaml | indent 10 }}
在所有这些情况下,我都将模板构造从第一列开始,然后使用 indent
函数正确缩进 YAML 块。仔细检查缩进并调整 indent
参数。
您还可以使用 helm template
,使用与安装图表时相同的 -f
选项,仔细检查结果是否正确。
(实际上,我可能会将您显示的许多选项直接放入图表模板中,而不是将它们作为值进行配置。例如,容器名称不需要进行配置,而且我' d 通常会修复命令。对于这个非常具体的示例,您还可以在 shell 包装器中设置容器的 workingDir:
而不是 运行 cd
。)
我的 values.yaml 中有这个定义,提供给 job.yaml
command: ["/bin/bash"]
args: ["-c", "cd /opt/nonrtric/ric-common/ansible/; cat group_vars/all"]
但是,在 pod 初始化后,我收到此错误:
/bin/bash: - : invalid option
如果我尝试这个语法:
command: ["/bin/sh", "-c"]
args:
- >
cd /opt/nonrtric/ric-common/ansible/ &&
cat group_vars/all
我收到此错误:Error: failed to start container "ric-register-avro": Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "/bin/sh -c": stat /bin/sh -c: no such file or directory: unknown
镜像中同时提供了sh和bash,为CentOS 7
job.yaml
---
apiVersion: batch/v1
kind: Job
metadata:
name: ric-register-avro
spec:
backoffLimit: 0
template:
spec:
containers:
- image: "{{ .Values.ric_register_avro_job.image }}"
name: "{{ .Values.ric_register_avro_job.name }}"
command: {{ .Values.ric_register_avro_job.containers.command }}
args: {{ .Values.ric_register_avro_job.containers.args }}
volumeMounts:
- name: all-file
mountPath: "/opt/nonrtric/ric-common/ansible/group_vars/"
readOnly: true
subPath: all
volumes:
- name: all-file
configMap:
name: ric-register-avro--configmap
restartPolicy: Never
values.yaml
global:
name: ric-register-avro
namespace: foo-bar
ric_register_avro_job:
name: ric-register-avro
all_file:
rest_api_url: http://10.230.227.13/foo
auth_username: foo
auth_password: bar
backoffLimit: 0
completions: 1
image: 10.0.0.1:5000/5gc/ric-app
containers:
name: ric-register-avro
command: ["/bin/bash"]
args: ["-c cd /opt/nonrtric/ric-common/ansible/; cat group_vars/all"]
restartPolicy: Never
我用这个:
command: ["/bin/sh"]
args: ["-c", "my-command"]
尝试这个简单的工作我没有问题:
apiVersion: batch/v1
kind: Job
metadata:
name: foo
spec:
template:
spec:
containers:
- name: foo
image: centos:7
command: ["/bin/sh"]
args: ["-c", "echo 'hello world'"]
restartPolicy: Never
在您的 Helm 图表中,您使用模板语法直接指定 command:
和 args:
command: {{ .Values.ric_register_avro_job.containers.command }}
args: {{ .Values.ric_register_avro_job.containers.args }}
但是,{{ ... }}
块的输出始终是一个字符串。如果模板中的值是其他类型,如列表,它将使用一些默认的 Go 规则转换为字符串,这在 Kubernetes 上下文中不是特别有用。
Helm 包含两个文档简单的转换函数 toJson
和 toYaml
,可以在此处提供帮助。有效的 JSON 也是有效的 YAML,因此一种简单的方法是将两部分都转换为 JSON
command: {{ toJson .Values.ric_register_avro_job.containers.command }}
args: {{ toJson .Values.ric_register_avro_job.containers.args }}
或者,如果您希望它看起来更像普通的 YAML,
command:
{{ .Values.ric_register_avro_job.containers.command | toYaml | indent 12 }}
args:
{{ .Values.ric_register_avro_job.containers.args | toYaml | indent 12 }}
或者,就此而言,如果您通过 Helm 值传递完整的容器描述,则足以
containers:
- name: ric_register_avro_job
{{ .Values.ric_register_avro_job.containers | toYaml | indent 10 }}
在所有这些情况下,我都将模板构造从第一列开始,然后使用 indent
函数正确缩进 YAML 块。仔细检查缩进并调整 indent
参数。
您还可以使用 helm template
,使用与安装图表时相同的 -f
选项,仔细检查结果是否正确。
(实际上,我可能会将您显示的许多选项直接放入图表模板中,而不是将它们作为值进行配置。例如,容器名称不需要进行配置,而且我' d 通常会修复命令。对于这个非常具体的示例,您还可以在 shell 包装器中设置容器的 workingDir:
而不是 运行 cd
。)