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?
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.
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
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;".