k8s initContainer mountPath does not exist after kubectl pod deployment

11/11/2019

Below is deployment yaml, after deployment, I could access the pod and I can see the mountPath "/usr/share/nginx/html", but I could not find "/work-dir" which should be created by initContainer. Could someone explain me the reason? Thanks and Rgds

apiVersion: v1
kind: Pod
metadata:
 name: init-demo
spec:
 containers:
 - name: nginx
   image: nginx
   ports:
   - containerPort: 80
   volumeMounts:
   - name: workdir
     mountPath: /usr/share/nginx/html
 # These containers are run during pod initialization
 initContainers:
 - name: install
   image: busybox
   command:
   - wget
   - "-O"
   - "/work-dir/index.html"
   - http://kubernetes.io
   volumeMounts:
   - name: workdir
     mountPath: "/work-dir"
 dnsPolicy: Default
 volumes:
 - name: workdir
   emptyDir: {}
-- stewchicken
kubernetes

2 Answers

11/11/2019

The volume at "/work-dir" is mounted by the init container and the "/work-dir" location only exists in the init container. When the init container completes, its file system is gone so the "/work-dir" directory in that init container is "gone". The application (nginx) container mounts the same volume, too, (albeit at a different location) providing mechanism for the two containers to share its content.

Per the docs:

Init containers can run with a different view of the filesystem than app containers in the same Pod.

-- apisim
Source: StackOverflow

11/12/2019

The volume mount with a PVC allows you to share the contents of /work-dir/ and /use/share/nginx/html/ but it does not mean the nginx container will have the /work-dir folder. Given this, you may think that you could just mount the path / which would allow you to share all folders underneath. However, a mountPath does not work for /.

So, how do you solve your problem? You could have another pod mount /work-dir/ in case you actually need the folder. Here is an example (pvc and deployment with mounts):

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: shared-fs-pvc
  namespace: default
  labels:
    mojix.service: default-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: default
  name: shared-fs
  labels:
    mojix.service: shared-fs
spec:
  replicas: 1
  selector:
    matchLabels:
      mojix.service: shared-fs
  template:
    metadata:
      creationTimestamp: null
      labels:
        mojix.service: shared-fs
    spec:
      terminationGracePeriodSeconds: 3
      containers:
      - name: nginx-c
        image: nginx:latest
        volumeMounts:
          - name: shared-fs-volume
            mountPath: /var/www/static/
      - name: alpine-c
        image: alpine:latest
        command: ["/bin/sleep", "10000s"]
        lifecycle:
          postStart:
            exec:
              command: ["/bin/mkdir", "-p", "/work-dir"]
        volumeMounts:
          - name: shared-fs-volume
            mountPath: /work-dir/
      volumes:
      - name: shared-fs-volume
        persistentVolumeClaim:
          claimName: shared-fs-pvc
-- Rodrigo Loza
Source: StackOverflow