32

It is how to run simple batch in kubernetes yaml (helloworld.yaml):

...
image: "ubuntu:14.04"
command: ["/bin/echo", "hello", "world"]
...

In Kubernetes i can deploy that like this:

$ kubectl create -f helloworld.yaml

Suppose i have a batch script like this (script.sh):

#!/bin/bash
echo "Please wait....";
sleep 5

Is there way to include the script.sh into kubectl create -f so it can run the script. Suppose now helloworld.yaml edited like this:

...
image: "ubuntu:14.04"
command: ["/bin/bash", "./script.sh"]
...

2 Answers 2

47

I'm using this approach in OpenShift, so it should be applicable in Kubernetes as well.

Try to put your script into a configmap key/value, mount this configmap as a volume and run the script from the volume.

apiVersion: batch/v1
kind: Job
metadata:
  name: hello-world-job
spec:
  parallelism: 1    
  completions: 1    
  template:         
    metadata:
      name: hello-world-job
    spec:
      volumes:
      - name: hello-world-scripts-volume
        configMap:
          name: hello-world-scripts
      containers:
      - name: hello-world-job
        image: alpine
        volumeMounts:
          - mountPath: /hello-world-scripts
            name: hello-world-scripts-volume
        env:
          - name: HOME
            value: /tmp
        command:
        - /bin/sh
        - -c
        - |
          echo "scripts in /hello-world-scripts"
          ls -lh /hello-world-scripts
          echo "copy scripts to /tmp"
          cp /hello-world-scripts/*.sh /tmp
          echo "apply 'chmod +x' to /tmp/*.sh"
          chmod +x /tmp/*.sh
          echo "execute script-one.sh now"
          /tmp/script-one.sh
      restartPolicy: Never
---
apiVersion: v1
items:
- apiVersion: v1
  data:
    script-one.sh: |
      echo "script-one.sh"
      date
      sleep 1
      echo "run /tmp/script-2.sh now"
      /tmp/script-2.sh
    script-2.sh: |
      echo "script-2.sh"
      sleep 1
      date
  kind: ConfigMap
  metadata:
    creationTimestamp: null
    name:  hello-world-scripts
kind: List
metadata: {}
5
  • 6
    I just want to stress the importance of restartPolicy: Never, because otherwise you might get CrashLoopBackOffs. See here.
    – JBSnorro
    Mar 19, 2020 at 15:48
  • Hey @JBSnorro thanks for the comment. My doubt is what happens if we set the restartPolicy: Never and our script fails due to some error?
    – aru_sha4
    Feb 1, 2021 at 12:07
  • can we bash over shell in pod Sep 15, 2021 at 5:43
  • 1
    Is there a need to use the list object? I was able to use multiple scripts and execute them as specified in the answer using a deployment without using list. But i am not able to figure out why list was used in the answer. Can anyone help please Sep 27, 2021 at 9:46
  • Why do we get the CrashLoopBackOff if we do not define the restartPolicy? Oct 20, 2021 at 14:35
15

As explained here, you could use the defaultMode: 0777 property as well, an example:

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-script
data:
  test.sh: |
    echo "test1"
    ls
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
spec:
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      volumes:
      - name: test-script
        configMap:
          name: test-script
          defaultMode: 0777
      containers:
      - command:
        - sleep
        - infinity
        image: ubuntu
        name: locust
        volumeMounts:
          - mountPath: /test-script
            name: test-script

You can enter into the container shell and execute the script /test-script/test.sh

3
  • Nice example; defaultMode or fsGroup is required to have the required permissions to run the script
    – kheraud
    Feb 25, 2021 at 14:21
  • 2
    You save my day!!!
    – John Jang
    Nov 13, 2021 at 9:36
  • when i add default mode as 0755, still my configmap has the 777 permission. lrwxrwxrwx 1 root root 22 Aug 16 19:31 parameters.conf -> ..data/parameters.conf Aug 16, 2022 at 19:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.