需求背景
我们的产品由于客制化需求,需要将产品中的logo替换为客户的,是一个svg文件,接手这个项目的时候,一直都是我们将产品镜像pull到本地,然后写Dockerfile将客户的logo.svg文件copy到镜像中,重新打包后部署到客户环境中,费时费力。
今天抽时间,来搞一下这个事情,将这个svg文件创建为configmap,然后容器挂载configmap到指定路径,这样后续就方便多了,不需要每次升级都写Dockerfile了。
本文主要想体现两个点:
- 将二进制文件创建为configmap;
- 将configmap中的某个key单独挂载为容器中的指定文件,并且不覆盖其目录下的其他文件,说白了就是k8s中的subPath;
将二进制文件创建为configmap
$ ls new/ # 准备好二进制文件,文件名会作为configmap中的keytest.svg# 将指定目录下的所有文件创建为名字是web-logo-test的configmap,每个文件名是一个key,value就是文件数据# --from-file:如果指定的是一个目录,就将目录下的每个文件以key(文件名): value(文件内容)的方式进行存储# 如果--from-file指定的是一个文件,那么这个configmap只有这一个文件的key-value。$ kubectl -n apim create configmap web-logo-test --from-file=new/configmap/web-logo-test created$ kubectl -n apim get cm web-logo-test # 确认configmap已创建NAME DATA AGEweb-logo-test 1 11m
将创建好的configmap挂载至容器中
$ kubectl -n apim edit deploy orchsym-web-3................ # 省略部分内容volumeMounts:- mountPath: /opt/orchsym/orchsym-web-3/iconfont/bsc-logo.svg # 指定要挂载到容器中的哪个文件name: liando-logo # 指定下面定义的volumes名字subPath: test.svg # 指定configmap中的key的名字,也就是创建configmap时,目录下的文件名volumes:- configMap:name: web-logo-test # 指定configmapname: liando-logo # 定义此configmap的挂载名字
编辑后,保存退出,容器会自动重启并应用配置。待容器重启成功后,可以自行登录到容器中,查看/opt/orchsym/orchsym-web-3/iconfont/目录是否被覆盖,另外,可以通过对比md5值,来确定是否正常生效。
