stop k8s initContainers volume overwriting container folder

12/20/2018

I need to download files into a specific folder of a container on a pod, at startup. The image for this container already has an existing folder with other files in it. (example is adding plugin jars to an application)

I've attempted the below example, however k8s volumeMounts overwrites the folder on container.

In the example below '/existing-folder-on-my-app-image/' is a folder on the my-app image which already contains files. When using the below I only get the downloaded plugin.jar in folder '/existing-folder-on-my-app-image/' and existing files are removed.

I want to add other files to this folder, but still keep those files which where there to start with.

How can I stop k8s from overwriting '/existing-folder-on-my-app-image/' to only have the files from initContainer?

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  initContainers:
  - name: config-data
    image: joosthofman/wget:1.0
    command: ["sh","-c","wget https://url.to.plugins/plugin.jar --no-check-certificate"]
    volumeMounts:
    - name: config-data
      mountPath: /config
  containers:
  - name: my-app
    image: my-app:latest
    volumeMounts:
    - name: config-data
      mountPath: /existing-folder-on-my-app-image/     
  volumes:
  - name: config-data
    emptyDir: {}
-- Melissa
kubernetes

1 Answer

12/20/2018

volume mounts always shadow the directory they are mounted to. a volume mount is the only way for an init container to manage files that are also visible to another container in the pod. if you want to copy files into a directory that already contains files in the main container image, you'll need to perform that copy as part of the container startup

-- Jordan Liggitt
Source: StackOverflow