41

At present I am creating a configmap from the file config.json by executing:

kubectl create configmap jksconfig --from-file=config.json

I would want the ConfigMap to be created as part of the deployment and tried to do this:

apiVersion: v1
kind: ConfigMap
metadata:
  name: jksconfig
data:
  config.json: |-
    {{ .Files.Get "config.json" | indent 4 }}

But doesn't seem to work. What should be going into configmap.yaml so that the same configmap is created?

---UPDATE---

when I do a helm install dry run:

# Source: mychartv2/templates/jks-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: jksconfig
data:
  config.json: |

Note: I am using minikube as my kubernetes cluster

Chillax
  • 4,418
  • 21
  • 56
  • 91
  • You showed a file from the chart/templates directory. If you have the chart then why you don't install the chart by helm? And also your deployment.yaml inside helm chart should have properly written. – Shudipta Sharma Nov 22 '18 at 11:47
  • I am able to use the configmap , I am looking for a way to create the configmap using yaml and not manually using the command `kubectl create configmap` – Chillax Nov 22 '18 at 12:25
  • It seems your configmap file has helm chart template. Why you don't use `$ helm install` command to create your needs. Helm will replace the template `{{ .Files.Get "config.json" | indent 4 }}` with the content of file `config.json`. – Shudipta Sharma Nov 22 '18 at 13:57
  • Indeed, I am using helm install. But it is not replacing the content as expected with the content of the file config.json nor throwing an error – Chillax Nov 22 '18 at 14:20
  • I think I got a soln. But first you need to show the output of `$ helm install --dry-run --debug` to see if the content is correctly indented or not – Shudipta Sharma Nov 22 '18 at 14:39
  • @ShudiptaSharma Updated my question – Chillax Nov 22 '18 at 14:52
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/184095/discussion-between-shudipta-sharma-and-chillax). – Shudipta Sharma Nov 22 '18 at 14:59

3 Answers3

61

Your config.json file should be inside your mychart/ directory, not inside mychart/templates

Chart Template Guide

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  config.json: |-
{{ .Files.Get "config.json" | indent 4}}

config.json

{
    "val": "key"
}

helm install --dry-run --debug mychart

[debug] Created tunnel using local port: '52091'     
                                                     
[debug] SERVER: "127.0.0.1:52091"                    
                                                     
...           
                                                     
NAME:   dining-saola                                 
REVISION: 1                                          
RELEASED: Fri Nov 23 15:06:17 2018                   
CHART: mychart-0.1.0                                 
USER-SUPPLIED VALUES:                                
{}                                                   
                                                     
...
                                                     
---                                                  
# Source: mychart/templates/configmap.yaml           
apiVersion: v1                                       
kind: ConfigMap                                      
metadata:                                            
  name: dining-saola-configmap                       
data:                                                
  config.json: |-                                    
    {                                                
        "val": "key"                                 
    }     

EDIT:

But I want it the values in the config.json file to be taken from values.yaml. Is that possible?

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  config.json: |-
    {
{{- range $key, $val := .Values.json }}
{{ $key | quote | indent 6}}: {{ $val | quote }}
{{- end}}
    }

values.yaml

json:
  key1: val1
  key2: val2
  key3: val3

helm install --dry-run --debug mychart

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mangy-hare-configmap
data:
  config.json: |-
    {
      "key1": "val1"
      "key2": "val2"
      "key3": "val3"
    }
moffeltje
  • 4,521
  • 4
  • 33
  • 57
edbighead
  • 5,607
  • 5
  • 29
  • 35
11

Here is an example of a ConfigMap that is attached to a Deployment:

ConfigMap:

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: jksconfig
data:
  config.json: |-
{{ .Files.Get "config.json" | indent 4 }}

Deployment:

---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: jksapp
  labels:
    app: jksapp
spec:
  selector:
    matchLabels:
      app: jksapp
  template:
    metadata:
      labels:
        app: jksapp
      containers:
        - name: jksapp
          image: jksapp:1.0.0
          ports:
            - containerPort: 8080
          volumeMounts:
            - name: config #The name(key) value must match pod volumes name(key) value 
              mountPath: /path/to/config.json
      volumes:
        - name: config
          configMap:
            name: jksconfig
Urosh T.
  • 3,336
  • 5
  • 34
  • 42
  • I was able to use the ConfigMap in my deployment. All I want is to know how to get the values from a config.json file ( I am creating it manually now) Also if I pasted the file contents instead of `{{ .Files.Get "config.json" | indent 4 }}` - that works too – Chillax Nov 22 '18 at 12:24
  • You use as you would any file on a path. You paste your file content bellow the line `config.json: |-`. – Urosh T. Nov 22 '18 at 12:34
  • 1
    I was looking for a way to import the data from the file config.json rather than having to paste the contents in the yaml file – Chillax Nov 22 '18 at 12:58
5

Soln 01:

  • insert your config.json file content into a template
  • then use this template into your data against config.json
  • then run $ helm install command

finally,

{{define "config"}}
{
    "a": "A",
    "b": {
        "b1": 1
    }
}
{{end}}

apiVersion: v1
kind: ConfigMap
metadata:
  name: jksconfig
  labels:
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    app: "my-app"
    heritage: "{{ .Release.Service }}"
    release: "{{ .Release.Name }}"
data:
  config.json: {{ (include "config" .) | trim | quote }}
Shudipta Sharma
  • 5,178
  • 3
  • 19
  • 33