How to parameterize image version when passing yaml for container creation

3/6/2017

Is there any way to pass image version from a varibale/config when passing a manifest .yaml to kubectl command

Example :

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:${IMAGE_VERSION}
        imagePullPolicy: Always
        resources:
         limits:
           cpu: "1.2"
           memory: 100Mi
        ports:
        - containerPort: 80

Use case is to launch specific image version which is set at kubernetes level, and that the variable is resolved by kubernetes itself at server side.

Thanks and Regards, Ravi

-- user1543211
kubernetes

4 Answers

1/20/2020
kind: Pod
metadata:
  creationTimestamp: null
  annotations:
    namespace: &namespaceId dev
    imageId: &imgageId nginx
    podName: &podName nginx-pod
    containerName: &containerName nginx-container
  name: *podName
  namespace: *namespaceId
spec:
  containers:
  - image: *imgageId
    name: *containerName
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
-- Isuru Amarathunga
Source: StackOverflow

3/6/2017

After looking into this recently we decided to just go with sed. Wrap kubectl apply into a small bash script and replace the placeholders before running apply.

We did look into more sophisticated tooling but we only found Helm. However Helm is a complex piece of technology that does way more than just templating. It changes your workflow a lot as you no longer deploy using kubectl and have to have a Helm package repo around to push your packages to. Our assessment was that Helm is not useful for deploying our application and using it for just the templating is overkill.

-- adam.sandor
Source: StackOverflow

3/6/2017

k8s manifest files are static yaml/json.

If you would like to template the manifests (and manage multiple resources in a bundle-like fashion), I strongly recommend you to have a look at Helm

I've recently created a Workshop which focuses precisely on the "Templating" features of Helm.

Helm does a lot more than just templating, it is built as a full fledged package manager for Kubernetes applications (think Apt/Yum/Homebrew).

If you want to handle everything client side, have a look at https://github.com/errordeveloper/kubegen

Although, at some point, you will need the other features of Helm and a migration will be needed when that time comes - I recommend biting the bullet and going for Helm straight up.

-- Vincent De Smet
Source: StackOverflow

7/4/2018

Here is an example how to do this with sed (it is a excerpt from my typical circleci config):

replaces="s/{.Namespace}/$CIRCLE_BRANCH/;";
replaces="$replaces s/{.CiBuild}/$CIRCLE_BUILD_NUM/; ";
replaces="$replaces s/{.CiCommit}/$CIRCLE_SHA1/; ";
replaces="$replaces s/{.CiUser}/$CIRCLE_USERNAME/; ";

cat ./k8s/app.yaml | sed -e "$replaces" | ./kubectl --kubeconfig=`pwd`/.kube/config apply --namespace=$NAMESPACE -f -
-- sergiy.dragunov
Source: StackOverflow