Kubernetes copy image data to volume mounts

11/29/2020

I need to share a directory between two containers: myapp and monitoring and to achieve this I created an emptyDir: {} and then volumeMount on both the containers.

spec:
      volumes:
        - name:  shared-data
          emptyDir: {}
      containers:
      - name: myapp
        volumeMounts:
          - name:  shared-data
            mountPath:  /etc/myapp/
      - name: monitoring
        volumeMounts:
          - name: shared-data
            mountPath: /var/read 

This works fine as the data I write to the shared-data directory is visible in both containers. However, the config file that is created when creating the container under /etc/myapp/myapp.config is hidden as the shared-data volume is mounted over /etc/myapp path (overlap).

How can I force the container to first mount the volume to /etc/myapp path and then cause the docker image to place the myapp.config file under the default path /etc/myapp except that it is the mounted volume thus allowing the config file to be accessible by the monitoring container under /var/read?

Summary: let the monitoring container read the /etc/myapp/myapp.config file sitting on myapp container.

Can anyone advice please?

-- Buggy B
kubernetes

2 Answers

12/9/2020

Consider using ConfigMaps with SubPaths.

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.

Sometimes, it is useful to share one volume for multiple uses in a single pod. The volumeMounts.subPath property specifies a sub-path inside the referenced volume instead of its root.

ConfigMaps can be used as volumes. The volumeMounts inside the template.spec are the same as any other volume. However, the volumes section is different. Instead of specifying a persistentVolumeClaim or other volume type you reference the configMap by name. Than you can add the subPath property which would look something like this:

volumeMounts:
  - name:  shared-data
    mountPath:  /etc/myapp/
    subPath: myapp.config

Here are the resources that would show you how to set it up:

-- WytrzymaƂy Wiktor
Source: StackOverflow

11/30/2020

Can you mount shared-data at /var/read in an init container and copy config file from /etc/myapp/myapp.config to /var/read?

-- Sameer Naik
Source: StackOverflow