Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to include script and run it into kubernetes yaml?

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"]
...
like image 372
smftr Avatar asked Jan 16 '17 10:01

smftr


People also ask

How do you pass command line arguments in Kubernetes?

Define Commands and Arguments for a Kubernetes Pod In order to define an argument within a container, we can make use of the command field. The moment we define commands, we would be needing arguments to be passed to it. We can pass these arguments to the command using the args field.


2 Answers

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: {} 
like image 152
Aldjinn Avatar answered Sep 16 '22 13:09

Aldjinn


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

like image 34
ruloweb Avatar answered Sep 20 '22 13:09

ruloweb