在 Kubernetes 中链接多个参数 (args)

Chain multiple arguments (args) in Kubernetes

我需要在容器中执行多行代码,这些代码作为参数传递,如下例所示: deployment.yaml 摘录

initContainers:
 - name: wait-for-migrations
   args:
    - python
    - -c
    - |
        print("python")
        ...more lines
    - bash
    - -c
    - |
        echo bash
        ...more lines


现在,无论我尝试过什么,我都无法执行两个 python/bash.. 只有第一个总是。 链接两者之间:

- ;

也没用。

有什么实施方法吗?

我认为为此创建一个专用脚本会更好。按照我下面显示的方式进行操作有点脏。

这是一般容器的限制。您不能 运行 多个命令。从这个意义上说,这与 Kubernetes 无关。 复杂命令的通常解决方法是将所有内容包装在一个 bash -c 中,即 bash -c "first command; second command"。 很多时候我们也看到他们加入 && 如果当前命令失败,它将不会执行任何进一步的命令,即 bash -c "first command && second command".

您不必将 commandargs 中的那些分开,但我认为它更简洁。

apiVersion: v1
kind: Pod
metadata:
  name: script
spec:
  containers:
    - name: script
      image: python
      command:
        - bash
        - -c
      args:
        - |
          echo "hello world";
          python -c '
          print("foo")
          print("bar")
          print("baz")
          ';
          sleep 180;

也就是说,由于您想等待迁移,将迁移移动到 Kubernetes 作业并在作业完成后检查 init 容器中的 Kubernetes API 可能会更干净。例如使用 kubectl。 迁移作业可以 运行 与主应用程序相同的映像,但执行其迁移命令(如果有的话)。

apiVersion: batch/v1
kind: Job
metadata:
  name: migration
spec:
  ttlSecondsAfterFinished: 100
  template:
    spec:
      containers:
        - name: migration
          image: busybox
          command: ["/bin/sh", "-c", "sleep 20"]
      restartPolicy: Never
---
apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  containers:
    - name: app
      image: busybox
      command: ["/bin/sh", "-c", "sleep 100"]
  initContainers:
    - name: wait-for-migration
      image: bitnami/kubectl
      args:
        - wait
        - job/migration
        - --for
        - condition=complete
        - --timeout
        - 60s