我正在尝试在kubernetes上将应用程序部署到GCP,但是部署失败,并显示错误the job spec is invalid ... the field is immutable
。
在迁移作业中,我有一部分bash采用以下格式:
args:
- |
/cloud_sql_proxy -instances=xxxxxxxxxxx:europe-west1:xxxxxxxxxxx=tcp:5432 -credential_file=/secrets/cloudsql/credentials.json -log_debug_stdout=true &
CHILD_PID=$!
(while true; do echo "waiting for termination file"; if [[ -f "/tmp/pod/main-terminated" ]]; then kill ; echo "Killed as the main container terminated."; fi; sleep 1; done) &
wait
if [[ -f "/tmp/pod/main-terminated" ]]; then exit 0; echo "Job completed. Exiting..."; fi
但是执行文件时,在GCP上的yaml中,我看到命令已用引号引起来,然后返回上述错误。
答案 0 :(得分:12)
出于其他原因,我收到了消息the job spec is invalid ... the field is immutable
,并想在这里简短地分享。
我正在尝试应用此Yaml文件:
apiVersion: extensions/v1beta1
kind: Deployment
spec:
selector:
matchLabels:
app: application-name
...
事实证明,此Yaml将替换同一Deployment的先前版本。当我运行kubectl get deployment application-name -o yaml
时,我看到了:
apiVersion: extensions/v1beta1
kind: Deployment
spec:
selector:
matchLabels:
app: application-name
track: stable
...
显然spec.selector.matchLabels
当前是一个数组,我试图用单个字符串替换它。我的解决方法是删除部署并重新部署。
答案 1 :(得分:0)
如果您在Pod定义中使用args,则意味着它是一个包含单字符串项目的数组。 (它不会在shell中运行命令)例如:
args:
- /cloud_sql_proxy
- -instances
- ...
或
args: [ "/cloud_sql_proxy", "-instances", "..." ]
解决此问题的方法是转到run the command in a shell:
command: [ "/bin/sh" ]
args:
- -c
- |
/cloud_sql_proxy -instances=xxxxxxxxxxx:europe-west1:xxxxxxxxxxx=tcp:5432 -credential_file=/secrets/cloudsql/credentials.json -log_debug_stdout=true &
CHILD_PID=$!
(while true; do echo "waiting for termination file"; if [[ -f "/tmp/pod/main-terminated" ]]; then kill ; echo "Killed as the main container terminated."; fi; sleep 1; done) &
wait
if [[ -f "/tmp/pod/main-terminated" ]]; then exit 0; echo "Job completed. Exiting..."; fi
数组中的引号(“)出于可读性考虑,它们也可以不是引号或单引号(')(如YAML specs所示)
希望有帮助。
答案 2 :(得分:0)
因此,此问题已解决。我必须将环境变量的值包装在yaml文件中,并用引号引起来。这样就解决了问题。
- name: DATABASE_URL:
value: "${DATABASE_URL}"