この公式ドキュメントでは、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}\""]
複数のコマンドを実行したい場合、どうすればよいですか?
command: ["/bin/sh","-c"]
args: ["command one; command two && command three"]
説明:command ["/bin/sh", "-c"]
は、「シェルを実行し、次の命令を実行します」と言います。引数はコマンドとしてシェルに渡されます。シェルスクリプトでは、セミコロンでコマンドを区切り、最初に成功した場合、&&
は条件付きで次のコマンドを実行します。上記の例では、command one
に続いてcommand two
が常に実行され、command three
が成功した場合にのみcommand two
が実行されます。
Alternative:多くの場合、実行するコマンドの一部は、実行する最終コマンドを設定している可能性があります。この場合、独自の Dockerfile を構築する方法があります。特に RUN ディレクティブを見てください。
私の好みは引数を複数行にすることです。これは最も簡単で読みやすいです。また、画像に影響を与えることなくスクリプトを変更できます。ポッドを再起動するだけです。たとえば、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が実際に「-」の後のすべての行を1つに連結し、shが1つの長い文字列「echo starting; ls ...; echo done;」を実行するためです。
ボリュームと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