Comment mettre plusieurs commandes dans un fichier yaml avec Kubernetes?

Dans ce document officiel, il peut exécuter une commande dans un fichier de configuration yaml:

http://kubernetes.io/v1.1/docs/user-guide/configuring-containers.html

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

Si je veux courir plus d'une commande, comment faire?

21
demandé sur scho 2015-11-24 09:53:11

3 réponses

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

Explication:command ["/bin/sh", "-c"] dit "exécuter un shell, et d'exécuter les instructions suivantes". Les args sont alors passés comme commandes au shell. Dans shell scripting un point-virgule sépare les commandes, et && exécute conditionnellement la commande suivante si la première réussit. Dans l'exemple ci-dessus, il fonctionne toujours command one suivi de command two, et ne s'exécute command three si command two réussi.

Solution: Dans de nombreux cas, certaines des commandes vous voulez exécuter sont probablement en train de configurer la commande finale pour exécuter. Dans ce cas, construisez votre propre Dockerfile est le chemin à parcourir. Regarder les RUN directive en particulier.

55
répondu Tim Allclair 2015-11-24 08:13:10

si vous êtes prêt à utiliser un Volume et une ConfigMap, vous pouvez mont ConfigMap de données en tant que script, puis lancez ce script:

---
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

cela nettoie un peu votre pod spec et permet des scripts plus complexes.

$ kubectl logs my-pod
Do this
Do that
5
répondu dhulihan 2018-02-26 18:34:22

Ma préférence est de multiligne l'args, c'est le plus simple et le plus facile à lire. Aussi, le script peut être modifié sans affecter l'image, suffit de redémarrer le boîtier. Par exemple, pour un dump mysql, la spécification du conteneur pourrait être quelque chose comme ceci:

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:
      - ...

la raison pour laquelle cela fonctionne est que yaml concaténate en fait toutes les lignes après le "-" en une seule, et sh exécute une longue chaîne "echo commençant; ls... ; echo faite;".

5
répondu Oliver 2018-04-12 16:24:33