需求背景
我们的产品由于客制化需求,需要将产品中的logo替换为客户的,是一个svg文件,接手这个项目的时候,一直都是我们将产品镜像pull到本地,然后写Dockerfile将客户的logo.svg文件copy到镜像中,重新打包后部署到客户环境中,费时费力。
今天抽时间,来搞一下这个事情,将这个svg文件创建为configmap,然后容器挂载configmap到指定路径,这样后续就方便多了,不需要每次升级都写Dockerfile了。
本文主要想体现两个点:
- 将二进制文件创建为configmap;
- 将configmap中的某个key单独挂载为容器中的指定文件,并且不覆盖其目录下的其他文件,说白了就是k8s中的subPath;
将二进制文件创建为configmap
$ ls new/ # 准备好二进制文件,文件名会作为configmap中的key
test.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 AGE
web-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 # 指定configmap
name: liando-logo # 定义此configmap的挂载名字
编辑后,保存退出,容器会自动重启并应用配置。待容器重启成功后,可以自行登录到容器中,查看/opt/orchsym/orchsym-web-3/iconfont/目录是否被覆盖,另外,可以通过对比md5值,来确定是否正常生效。