How to map one single file into kubernetes pod using hostPath?

8/3/2017

I have one own nginx configuration /home/ubuntu/workspace/web.conf generated by script. I prefer to have it under /etc/nginx/conf.d besides default.conf

Below is the nginx.yaml

apiVersion: v1 kind: Pod metadata: name: nginx spec: volumes: - name: webconf hostPath: path: /home/ubuntu/workspace/web.conf containers: - image: nginx name: nginx ports: - containerPort: 18001 protocol: TCP
volumeMounts: - mountPath: /etc/nginx/conf.d/web.conf name: web

While it is mapped as folder only

$ kubectl create -f nginx.yaml pod "nginx" created $ kubectl exec -it nginx -- bash root@nginx:/app# ls -al /etc/nginx/conf.d/ total 12 drwxr-xr-x 1 root root 4096 Aug 3 12:27 . drwxr-xr-x 1 root root 4096 Aug 3 11:46 .. -rw-r--r-- 2 root root 1093 Jul 11 13:06 default.conf drwxr-xr-x 2 root root 0 Aug 3 11:46 web.conf

It works for docker container -v hostfile:containerfile.

How can I do this in kubernetes ?

BTW: I use minikube 0.21.0 on Ubuntu 16.04 LTS with kvm

-- Larry Cai
kubernetes
kvm
minikube

2 Answers

8/3/2017

Actually it is caused by kvm which is used by minikube.

path: /home/ubuntu/workspace/web.conf

If I login to minikube, it is folder in vm.

$ ls -al /home/ubuntu/workspace # in minikube host
total 12
drwxrwxr-x 2 ubuntu ubuntu 4096 Aug  3 12:11 .
drwxrwxr-x 5 ubuntu ubuntu 4096 Aug  3 19:28 ..
-rw-rw-r-- 1 ubuntu ubuntu 1184 Aug  3 12:11 web.conf
$ minikube ssh
$ ls -al /home/ubuntu/workspace # in minikube vm
total 0
drwxr-xr-x 3 root root 0 Aug  3 19:41 .
drwxr-xr-x 4 root root 0 Aug  3 19:41 ..
drwxr-xr-x 2 root root 0 Aug  3 19:41 web.conf

I don't know exactly why kvm host folder sharing behalf like this.

Therefore instead I use minikube mount command, see host_folder_mount.md, then it works as expected.

-- Larry Cai
Source: StackOverflow

8/3/2017

Try using the subPath key on your volumeMounts like this:

apiVersion: v1
kind: Pod
metadata:
  name: singlefile
spec:
  containers:
  - image: ubuntu
    name: singlefiletest
    command:
      - /bin/bash
      - -c
      - ls -la /singlefile/ && cat /singlefile/hosts
    volumeMounts:
    - mountPath: /singlefile/hosts
      name: etc
      subPath: hosts
  volumes:
  - name: etc
    hostPath:
      path: /etc

Example:

$ kubectl apply -f singlefile.yaml
pod "singlefile" created
$ kubectl logs singlefile
total 24
drwxr-xr-x. 2 root root 4096 Aug  3 12:50 .
drwxr-xr-x. 1 root root 4096 Aug  3 12:50 ..
-rw-r--r--. 1 root root 1213 Apr 26 21:25 hosts
# /etc/hosts: Local Host Database
#
# This file describes a number of aliases-to-address mappings for the for 
# local hosts that share this file.
...
-- coreypobrien
Source: StackOverflow