Kubernetes helm 使用&&;

Kubernetes helm 使用&&;,kubernetes-helm,Kubernetes Helm,Django应用程序运行迁移和收集静态文件的主要任务如下: apiVersion: batch/v1 kind: Job metadata: name: django-app-job labels: app.kubernetes.io/name: django-app-job helm.sh/chart: django-app app.kubernetes.io/instance: staging-admin app.kubernetes.io/manag

Django应用程序运行迁移和收集静态文件的主要任务如下:

apiVersion: batch/v1
kind: Job
metadata:
  name: django-app-job
  labels:
    app.kubernetes.io/name: django-app-job
    helm.sh/chart: django-app
    app.kubernetes.io/instance: staging-admin
    app.kubernetes.io/managed-by: Tiller
  annotations:
    "helm.sh/hook": pre-install,pre-upgrade
    "helm.sh/hook-weight": "1"
    "helm.sh/hook-delete-policy": hook-succeeded,hook-failed
spec:
  template:
    metadata:
      labels:
        app.kubernetes.io/name: django-app-job
        app.kubernetes.io/instance: foobar
    spec:
      restartPolicy: OnFailure
      containers:
        - name: django-app
          command:
          - "/bin/bash"
          - "-c"
          - "python3 ./manage.py migrate"
          - "&&"
          - "python3 ./manage.py collectstatic --noinput"
但这只执行migrate来更新DB模式,但它从未运行collect静态。即使迁移运行正常。作业不会失败,因为如果不失败,升级将失败,而这不会发生

但如果我将命令更改为:

      containers:
        - name: django-app
          command:
          - "/bin/bash"
          - "-c"
          - "python3 ./manage.py migrate && python3 ./manage.py collectstatic --noinput"

现在作业运行迁移和收集静态数据。这两个命令之间有什么区别

在较低的级别上,所有Unix命令实际上都是作为一个字序列执行的。通常,shell会将命令行拆分为单词,但在Kubernetes清单中,您必须一次手动指定一个单词

在您的示例中,只读取下一个单词,并将其作为命令执行,应用常规shell规则。如果命令碰巧使用了变量,如
$1
,则任何剩余的单词都将用作位置参数

您可以在本地shell中的Kubernetes之外演示这一点,使用引号强制shell按照您想要的方式分解单词:

#选项一
'/bin/sh'-c''echo foo''&&&''echo bar'
#打印“foo”
#选择二
“/bin/sh”“-c”“echo foo和echo bar”
#打印“foo”、“bar”
一个经常出现的技巧是在多行中编写一个字符串,给出一些看起来像shell脚本但实际上不是的东西

命令:['/bin/sh','-c']
args:>-
python3./manage.py迁移
&&
python3./manage.py collectstatic--noinput

在较低的级别上,所有Unix命令实际上都是作为一个字序列执行的。通常,shell会将命令行拆分为单词,但在Kubernetes清单中,您必须一次手动指定一个单词

在您的示例中,只读取下一个单词,并将其作为命令执行,应用常规shell规则。如果命令碰巧使用了变量,如
$1
,则任何剩余的单词都将用作位置参数

您可以在本地shell中的Kubernetes之外演示这一点,使用引号强制shell按照您想要的方式分解单词:

#选项一
'/bin/sh'-c''echo foo''&&&''echo bar'
#打印“foo”
#选择二
“/bin/sh”“-c”“echo foo和echo bar”
#打印“foo”、“bar”
一个经常出现的技巧是在多行中编写一个字符串,给出一些看起来像shell脚本但实际上不是的东西

命令:['/bin/sh','-c']
args:>-
python3./manage.py迁移
&&
python3./manage.py collectstatic--noinput