需求
很多時候在制作Docker鏡像時,對于有些程序存在個性化配置時,Dockerfile提供的的ADD
方式就顯得不太靈活。
比如某些特定的場景下,不同業務的PHP模塊配置有差異時,就需要在容器啟動時將外部配置文件注入到容器里面的指定路徑。這個工作其實可以用Kubernetes的ConfigMap對象完成。
操作
ConfigMap在默認掛載到容器是以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
這個時候實際上Pod里面會在容器里面創建一個 名為/app_conf/app1.config
目錄,實際的app1.config這個配置文件會在這個目錄下面。這個時候配置文件并沒有生效。
如果將mountPath路徑改為/app_conf
,這個時候容器掛載volumes的時候會掛載到/app_conf/
目錄,而這個目錄下原本的文件。
如何將ConfigMap以文件的形式掛載到容器呢?
這個問題,在GitHub上已經提出了解決方法
configmap file mount path results in command not found error #44815
按照方法,只需要添加一個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
根據官網對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是用來對于一個Volume分別給多個容器使用時,會根據subPath
給出的key創建目錄。在這個例子中site-data這個Volume在分別個mysql和php容器使用時,html的內容映射在site-data卷的html子目錄,而數據庫則保存在site-data卷的mysql目錄。
官網中并沒有給出能以file的形式掛載volume,給人比較奇怪。