Подтвердить что ты не робот

Как установить несколько команд в одном файле yaml с помощью Kubernetes?

В этом официальном документе он может выполнить команду в файле конфигурации yaml:

https://kubernetes.io/docs/tasks/configure-pod-container/

apiVersion: v1
kind: Pod
metadata:
  name: hello-world
spec:  # specification of the pods contents
  restartPolicy: Never
  containers:
  - name: hello
    image: "ubuntu:14.04"
    env:
    - name: MESSAGE
      value: "hello world"
    command: ["/bin/sh","-c"]
    args: ["/bin/echo \"${MESSAGE}\""]

Если я хочу выполнить более одной команды, как это сделать?

4b9b3361

Ответ 1

command: ["/bin/sh","-c"]
args: ["command one; command two && command three"]

Объяснение: command ["/bin/sh", "-c"] говорит: "Запустите оболочку и выполните следующие инструкции". Затем аргументы передаются как команды в оболочку. В сценариях оболочки точка с запятой отделяет команды, а && условно запускает следующую команду, если первое выполняется. В приведенном выше примере он всегда запускает command one, за которым следует command two, и выполняется только command three, если command two выполнено успешно.

Альтернатива: Во многих случаях некоторые из команд, которые вы хотите запустить, вероятно, настраивают окончательную команду для запуска. В этом случае вы можете создать свой собственный Dockerfile. Посмотрите на RUN директиву в частности.

Ответ 2

Я предпочитаю многострочный арг, это самый простой и легкий для чтения. Также скрипт можно изменить, не затрагивая изображение, просто нужно перезагрузить модуль. Например, для дампа mysql спецификация контейнера может выглядеть примерно так:

containers:
  - name: mysqldump
    image: mysql
    command: ["/bin/sh", "-c"]
    args:
      - echo starting;
        ls -la /backups;
        mysqldump --host=... -r /backups/file.sql db_name;
        ls -la /backups;
        echo done;
    volumeMounts:
      - ...

Причина, по которой это работает, заключается в том, что yaml фактически объединяет все строки после "-" в одну, а sh запускает одну длинную строку "echo начиная; ls...; echo done;".

Ответ 3

Если вы хотите использовать том и ConfigMap, вы можете смонтировать данные ConfigMap в виде скрипта, а затем запустить этот скрипт:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  entrypoint.sh: |-
    #!/bin/bash
    echo "Do this"

    echo "Do that"
---
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: "ubuntu:14.04"
    command:
    - /bin/entrypoint.sh
    volumeMounts:
    - name: configmap-volume
      mountPath: /bin/entrypoint.sh
      readOnly: true
      subPath: entrypoint.sh
  volumes:
  - name: configmap-volume
    configMap:
      defaultMode: 0700
      name: my-configmap

Это немного очищает ваши спецификации и позволяет создавать более сложные сценарии.

$ kubectl logs my-pod
Do this
Do that

Ответ 4

Если вы хотите избежать объединения всех команд в одну команду с помощью ; или &&, вы также можете получить настоящие многострочные сценарии с использованием heredoc:

command: 
 - sh
 - "-c"
 - |
   /bin/bash <<'EOF'

   # Normal script content possible here
   echo "Hello world"
   ls -l
   exit 123

   EOF

Это удобно для запуска существующих сценариев bash, но имеет недостаток в том, что для настройки heredoc требуется экземпляр как внутренней, так и внешней оболочки.