14

I have multiple configuration files in two directories. For example,

  • conf.d/parentconf1.conf
  • con.d/node1/child1.conf
  • conf.d/node2/child2.conf

I need to mount these configuration files in the same directory structure to kubernetes pod using ConfigMap.

Tried using the

kubectl create configmap --from-file=./conf.d --from-file=./conf.d/node1/child1.conf --from-file=./conf.d/node2/child2.conf. 

Config map created, as expected, cannot express the nested directory structure.

Is it possible to create ConfigMap recursively from folders and still retain the folder structure in the name of the key entry for the ConfigMap - since the intention is to mount these ConfigMaps into pods?

Arslanbekov Denis
  • 1,674
  • 12
  • 26
nashter
  • 1,181
  • 1
  • 15
  • 33

3 Answers3

13

Unfortunately, reflecting directory structure in configmap is not supported currently. Workaround is to express directory hierarchy like this:

apiVersion: v1
kind: ConfigMap
metadata:
   name: testconfig
data:
  file1: |
    This is file1
  file2: |
    This is file2 in subdir directory
---
apiVersion: v1
kind: Pod
metadata:
  name: testpod
spec:
  restartPolicy: Never
  containers:
    - name: test-container
      image: gcr.io/google_containers/busybox
      command: [ "/bin/sh","-c", "sleep 1000" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: testconfig
        items:
        - key: file2
          path: subdir/file2
        - key: file1
          path: file1
Vasili Angapov
  • 8,061
  • 15
  • 31
  • These configuration files are multi-pipline configuration files for logstash. So, there will be 10-12 files already (bound to grow). Currently, I used the approach to mount the nested directory to a different config-map using kubectl. Going with the work-around. – nashter Apr 26 '19 at 05:07
  • Are there a way to mount one additional nested file in the subdir, but the rest of files - as a first-level mount? I have 1 file in a subdirectory and a bunch of them on the first level, so it's not really convenient to list all the files. – Albert Bikeev Sep 16 '20 at 14:17
10

An automatable workaround: tar your files, map the tar configmap volume file in /tmp, and untar it at the start of the container.

Create the tar:

tar -cvf conf-d.tar ./conf.d
kubectl create configmap conf-d --from-file=conf-d.tar
rm conf-d.tar

and in your pod.yml, add the tar -xf before your command, or before your default image command:

    command: [ "/bin/sh","-c", "tar -xf /tmp/conf-d.tar -C /etc/ && sleep 1000" ]
    volumeMounts:
      - mountPath: /tmp/conf-d.tar
        name: nginx-config-volume
        subPath: conf-d.tar
Vincent J
  • 4,968
  • 4
  • 40
  • 50
5

When writing templates for Helm charts the built-in tooling can be used to create a config map or secret with all files in a directory.

Directory structure:

test
├── bar
│   └── init.sh
├── foo
│   ├── some.sh
│   └── thing.sh
└── README

Helm config map template:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  {{- $files := .Files }}
  {{- range $path, $_ := .Files.Glob "test/**" }}
  {{ $path | replace "/" "." }}: |
{{ $files.Get $path | indent 4 }}
  {{- end }}

Result:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  test.bar.init.sh: |
    echo foo
  test.foo.some.sh: |
    echo foo
  test.foo.thing.sh: |
    echo foo
  test.README: |
    # My title

Tested with helm 3.7.1

aemaem
  • 935
  • 10
  • 20