Pod の command に指定するスクリプトを ConfigMap で差し込む

Posted on

Pod template の command には実行したいコマンドをリストで渡せます。

apiVersion: batch/v1
kind: Job
metadata:
  name: hello
spec:
  template:
    spec:
      containers:
      - name: hello
        image: busybox
        command: ['sh', '-c', 'echo "Hello, Kubernetes!"']
      restartPolicy: OnFailure

上のような単純なコマンドなら問題ないのですが、少し複雑なことをしようとするとスクリプトでラップしたくなります(たとえば、引数をコマンド置換で渡したいケース)。

image で指定するコンテナイメージにラッパースクリプトを含めてしまうのが王道だと思いますが、このためだけに Dockerfile を書いたりコンテナイメージを管理するのは面倒です。

そんなときは ConfigMap にラッパースクリプトを定義して、その ConfigMap を Volume としてマウントしてしまうのが楽です。

apiVersion: v1
kind: ConfigMap
metadata:
  name: scripts
data:
  hello.sh: |
    #!/bin/sh
    echo "Hello, Kubernetes!"
---
apiVersion: batch/v1
kind: Job
metadata:
  name: hello
spec:
  template:
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["/bin/sh", "/tmp/hello.sh"]
        volumeMounts:
        - name: config-volume
          mountPath: /tmp
      volumes:
      - name: config-volume
        configMap:
          name: scripts
          items:
            - key: hello.sh
              path: hello.sh
      restartPolicy: OnFailure

知っている人にとっては当たり前の Tips かもしれませんが、チームメイトに教えてもらって「なるほどー」と思ったので忘れないようにメモしておきます。