web-dev-qa-db-fra.com

Comment définir 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 exécuter plus d'une commande, comment faire?

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

Explication: Le command ["/bin/sh", "-c"] dit "lancez un shell et exécutez les instructions suivantes". Les arguments sont ensuite passés en tant que commandes au shell. Dans les scripts Shell, 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 exécute toujours command one suivi par command two, et ne lance que command three si command two réussi.

Alternative: Dans de nombreux cas, certaines des commandes que vous souhaitez exécuter configurent probablement la dernière commande à exécuter. Dans ce cas, construire votre propre Dockerfile est la voie à suivre. Regardez la directive RUN en particulier.

93
Tim Allclair

Ma préférence va aux lignes multiples, ceci est le plus simple et le plus facile à lire. En outre, le script peut être modifié sans affecter l'image, il suffit de redémarrer le pod. Par exemple, pour un vidage mysql, la spécification du conteneur pourrait ressembler à 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:
      - ...

Cela fonctionne parce que yaml concatène en fait toutes les lignes après le "-" en une seule et sh exécute une longue chaîne "echo start; Ls ...; echo done;".

31
Oliver

Si vous souhaitez utiliser un volume et un ConfigMap, vous pouvez monter des données ConfigMap en tant que script, puis exécuter 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 vos spécifications de pod et permet des scripts plus complexes.

$ kubectl logs my-pod
Do this
Do that
25
dhulihan