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