web-dev-qa-db-ja.com

Kubernetesで1つのyamlファイルに複数のコマンドを設定するにはどうすればよいですか?

この公式ドキュメントでは、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}\""]

複数のコマンドを実行したい場合、どうすればよいですか?

48
scho
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 ディレクティブを見てください。

93
Tim Allclair

私の好みは引数を複数行にすることです。これは最も簡単で読みやすいです。また、画像に影響を与えることなくスクリプトを変更できます。ポッドを再起動するだけです。たとえば、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;」を実行するためです。

31
Oliver

ボリュームと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
25
dhulihan