Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the best way to share/mount one file into a pod?

Tags:

kubernetes

People also ask

How do I transfer files from host to Kubernetes pod?

Use "kubectl cp" to Copy Files to and from Kubernetes Pods.

How do I mount a ConfigMap in Kubernetes?

Mount the configmap into the application container Create a container using the specified image from DockerHub; Make the configmap clusters-config-file available as a mountable volume called clusters-config-volume ; and. Mount that volume into the container at the path /clusters-config.


For example you have a configmap which contain 2 config files:

kubectl create configmap config --from-file <file1> --from-file <file2>

You could use subPath like this to mount single file into existing directory:

---
        volumeMounts:
        - name: "config"
          mountPath: "/<existing folder>/<file1>"
          subPath: "<file1>"
        - name: "config"
          mountPath: "/<existing folder>/<file2>"
          subPath: "<file2>"
      restartPolicy: Always
      volumes:
        - name: "config"
          configMap:
            name: "config"
---

Full example here


I'd start with this working example from here. Make sure you're using at least Kubernetes 1.3.

Simply create a ConfigMap like this:

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-pd-plus-cfgmap
data:
  file-from-cfgmap: file data

And then create a pod like this:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd-plus-cfgmap
spec:
  containers:
  - image: ubuntu
    name: bash
    stdin: true
    stdinOnce: true
    tty: true
    volumeMounts:
    - mountPath: /mnt
      name: pd
    - mountPath: /mnt/file-from-cfgmap
      name: cfgmap
      subPath: file-from-cfgmap
  volumes:
  - name: pd
    gcePersistentDisk:
      pdName: testdisk
  - name: cfgmap
    configMap:
      name: test-pd-plus-cfgmap

There is currently (v1.0, v1.1) no way to volume mount a single config file. The Secret structure is naturally capable of representing multiple secrets, which means it must be a directory.

When we get config objects, single files should be supported.

In the mean time you can mount a directory and symlink to it from your image, maybe?


An useful additional information to the accepted answer:

Let's say your origin file is called environment.js, and you want the destination file to be called destination_environment.js, then, your yaml file should look like this:

---
        volumeMounts:
        - name: "config"
          mountPath: "/<existing folder>/destination_environment.js"
          subPath: "environment.js"
      volumes:
        - name: "config"
          configMap:
            name: "config"
---

I don't have a reputation to vote or reply to threads, so I'll post here. The most up-voted answer does not work as it is stated (at least in k8s 1.21.1):

          volumeMounts:
            - mountPath: /opt/project/config.override.json
              name: config-override
              subPath: config.override.json
          command:
            - ls
            - -l
            - /opt/project/config.override.json

produces an empty dir /opt/project/config.override.json. I'm digging through docs and google for several hours already and I am still not able to mount this single json file as json file.

I've also tried this:

          volumeMounts:
            - mountPath: /opt/project/
              name: config-override
              subPath: config.override.json
          command:
            - ls
            - -l
            - /opt/project

Quite obviously it lists /opt/project as empty dir as it tries to mount a json file to it. File with name config.override.json is not created in this case.

PS: the only way to mount to file at all is this:

          volumeMounts:
            - mountPath: /opt/project/override
              name: config-override
          command:
            - ls
            - -l
            - /opt/project/override

It creates a directory /opt/project/override and symlinks an original filename used in configMap creation to the needed content:

lrwxrwxrwx 1 root root 27 Jun 27 14:37 config.override.json -> ..data/config.override.json