Home > Back-end >  How to import a config file into a container from k8s
How to import a config file into a container from k8s

Time:03-12

I have a docker file which I've written for a React application. This app takes a .json config file that it uses at run time. The file doesn't contain any secrets.

So I've built the image without the config file, and now I'm unsure how to transfer the JSON file when I run it up.

I'm looking at deploying this in production using a CI/CD process which would entail:

  • gitlab (actions) building the image
  • pushing this to a docker repository
  • Kubernetes picking this up and running/starting the container

I think it's at the last point that I want to add the JSON configuration.

My question is: how do I add the config file to the application when k8's starts it up?

If I understand correctly, k8s doesn't have any local storage to create a volume from to copy it in? Can I give docker run a separate git repo where I can hold the config files?

CodePudding user response:

You should take a look at configmap.

From k8s documentation configmap:

A ConfigMap is an API object used to store non-confidential data in key-value pairs. Pods can consume ConfigMaps as environment variables, command-line arguments, or as configuration files in a volume.

In your case, you want as a volume to have a file.

apiVersion: v1
kind: ConfigMap
metadata:
  name: your-app
data:
  config.json: #you file name
    <file-content>

A configmap can be create manually or generated from a file using:

  • Directly in the cluster:kubectl create configmap <name> --from-file <path-to-file>.
  • In a yaml file:kubectl create configmap <name> --from-file <path-to-file> --dry-run=client -o yaml > <file-name>.yaml.

When you got your configmap, you must modify your deployment/pod to add a volume.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: <your-name>
spec:  
  ...
  template:
    metadata:
      ...
    spec:
      ...
      containers:
        - name: <container-name>
          ...
          volumeMounts:
            - mountPath: '<path>/config.json'
              name: config-volume
              readOnly: true
              subPath: config.json
      volumes:
        - name: config-volume
          configMap:
            name: <name-of-configmap>

To deploy to your cluster, you can use plain yaml or I suggest you take a look at Kustomize or Helm charts­.

They are both popular system to deploy applications. If kustomize, there is the configmap generator feature that fit your case.

Good luck :)

  • Related