需求
很多時(shí)候在制作Docker鏡像時(shí)存璃,對(duì)于有些程序存在個(gè)性化配置時(shí)驱证,Dockerfile提供的的ADD
方式就顯得不太靈活撑毛。
比如某些特定的場(chǎng)景下牙躺,不同業(yè)務(wù)的PHP模塊配置有差異時(shí)愁憔,就需要在容器啟動(dòng)時(shí)將外部配置文件注入到容器里面的指定路徑。這個(gè)工作其實(shí)可以用Kubernetes的ConfigMap對(duì)象完成孽拷。
操作
ConfigMap在默認(rèn)掛載到容器是以Volumes的形式吨掌,比如這樣:
containers:
- image: alpine:latest
name: my-project
volumeMounts:
- mountPath: /app_conf/app1.config
name: my-project
volumes:
- name: my-project
configMap:
items:
- key: config-app1
path: app1.config
這個(gè)時(shí)候?qū)嶋H上Pod里面會(huì)在容器里面創(chuàng)建一個(gè) 名為/app_conf/app1.config
目錄,實(shí)際的app1.config這個(gè)配置文件會(huì)在這個(gè)目錄下面脓恕。這個(gè)時(shí)候配置文件并沒(méi)有生效思犁。
如果將mountPath路徑改為/app_conf
,這個(gè)時(shí)候容器掛載volumes的時(shí)候會(huì)掛載到/app_conf/
目錄进肯,而這個(gè)目錄下原本的文件激蹲。
如何將ConfigMap以文件的形式掛載到容器呢?
這個(gè)問(wèn)題江掩,在GitHub上已經(jīng)提出了解決方法
configmap file mount path results in command not found error #44815
按照方法学辱,只需要添加一個(gè)subPath
字段即可,如下:
containers:
- image: alpine:latest
name: my-project
volumeMounts:
- mountPath: /app_conf/app1.config
subPath: app1.config
name: my-project
volumes:
- name: my-project
configMap:
items:
- key: config-app1
path: app1.config
根據(jù)官網(wǎng)對(duì)SubPath的描述
Using SubPath
Sometimes, it is useful to share one volume for multiple uses in a single pod. The volumeMounts.subPath property can be used to specify a sub-path inside the referenced volume instead of its root.
Here is an example of a pod with a LAMP stack (Linux Apache Mysql PHP)
using a single, shared volume. The HTML contents are mapped to its html folder, and the databases will be stored in its mysql folder:
apiVersion: v1
kind: Pod
metadata:
name: my-lamp-site
spec:
containers:
- name: mysql
image: mysql
volumeMounts:
- mountPath: /var/lib/mysql
name: site-data
subPath: mysql
- name: php
image: php
volumeMounts:
- mountPath: /var/www/html
name: site-data
subPath: html
volumes:
- name: site-data
persistentVolumeClaim:
claimName: my-lamp-site-data
subPath是用來(lái)對(duì)于一個(gè)Volume分別給多個(gè)容器使用時(shí)环形,會(huì)根據(jù)subPath
給出的key創(chuàng)建目錄策泣。在這個(gè)例子中site-data這個(gè)Volume在分別個(gè)mysql和php容器使用時(shí),html的內(nèi)容映射在site-data卷的html子目錄抬吟,而數(shù)據(jù)庫(kù)則保存在site-data卷的mysql目錄萨咕。
官網(wǎng)中并沒(méi)有給出能以file的形式掛載volume,給人比較奇怪火本。