需求
很多时候在制作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,给人比较奇怪。