Invoking a script file in helm k8s job template

4/12/2020

I am trying to invoke a script inside a helm k8s job template. When I run helm with

helm install ./mychartname/ --generate-name

The job runs however, it couldn't find the script file (run.sh). Is this possible with helm?

apiVersion: batch/v1
    kind: Job
    metadata:
      name: pre-install-job
    spec:
      template:
        spec:
          containers:
          - name: pre-install
            image: busybox
            imagePullPolicy: IfNotPresent

            command: ['sh', '-c', '../run.sh']

          restartPolicy: OnFailure
          terminationGracePeriodSeconds: 0

      backoffLimit: 3
      completions: 1
      parallelism: 1

Here is my directory structure

├── mychartname
│   ├── templates
│   │   ├── test.job
│   │──run.sh   
-- Minisha
kubernetes-helm

2 Answers

4/12/2020

Below is the way to achieve running of script inside helm template

apiVersion: batch/v1
    kind: Job
    metadata:
      name: pre-install-job-v05
    spec:
      template:
        spec:
          containers:
          - name: pre-install-v05
            image: busybox
            imagePullPolicy: IfNotPresent
            command: ["/bin/sh", "-c", {{.Files.Get "scripts/run.sh" }}]
          restartPolicy: OnFailure
          terminationGracePeriodSeconds: 0

      backoffLimit: 3
      completions: 1
      parallelism: 1
-- Minisha
Source: StackOverflow

4/12/2020

In general, Kubernetes only runs software that's packaged in Docker images. Kubernetes will never run things off of your local system. In your example, the cluster will create a new unmodified busybox container, then from that container's root directory, try to run sh -c ../run.sh; since that script isn't part of the stock busybox image, it won't run.

The best approach here is to build an image out of your script and push it to a Docker registry. This is the standard way to run any custom software in Kubernetes, so you probably already have a workflow to do it. (For a test setup in Minikube you can point your local Docker at the Minikube environment and build a local image, but this doesn't scale to things hosted in the cloud or otherwise running on a multi-host environment.)

In principle you could upload the script in a config map in a separate Helm template file, mount it into your job spec, and run it (you may need to explicitly sh run.sh to get around file-permission issues). Depending on your environment this may work as well as actually having an image, but if you need to update and redeploy the Helm chart every time the script changes, it's "more normal" to do the same work by having your CI system build and upload a new image (and it'll be the same approach as for your application deployments).

-- David Maze
Source: StackOverflow