需求背景

我们的产品由于客制化需求,需要将产品中的logo替换为客户的,是一个svg文件,接手这个项目的时候,一直都是我们将产品镜像pull到本地,然后写Dockerfile将客户的logo.svg文件copy到镜像中,重新打包后部署到客户环境中,费时费力。

今天抽时间,来搞一下这个事情,将这个svg文件创建为configmap,然后容器挂载configmap到指定路径,这样后续就方便多了,不需要每次升级都写Dockerfile了。

参考:subPath字段和items 字段

本文主要想体现两个点:

  • 将二进制文件创建为configmap;
  • 将configmap中的某个key单独挂载为容器中的指定文件,并且不覆盖其目录下的其他文件,说白了就是k8s中的subPath;

将二进制文件创建为configmap

  1. $ ls new/ # 准备好二进制文件,文件名会作为configmap中的key
  2. test.svg
  3. # 将指定目录下的所有文件创建为名字是web-logo-test的configmap,每个文件名是一个key,value就是文件数据
  4. # --from-file:如果指定的是一个目录,就将目录下的每个文件以key(文件名): value(文件内容)的方式进行存储
  5. # 如果--from-file指定的是一个文件,那么这个configmap只有这一个文件的key-value。
  6. $ kubectl -n apim create configmap web-logo-test --from-file=new/
  7. configmap/web-logo-test created
  8. $ kubectl -n apim get cm web-logo-test # 确认configmap已创建
  9. NAME DATA AGE
  10. web-logo-test 1 11m

将创建好的configmap挂载至容器中

  1. $ kubectl -n apim edit deploy orchsym-web-3
  2. ................ # 省略部分内容
  3. volumeMounts:
  4. - mountPath: /opt/orchsym/orchsym-web-3/iconfont/bsc-logo.svg # 指定要挂载到容器中的哪个文件
  5. name: liando-logo # 指定下面定义的volumes名字
  6. subPath: test.svg # 指定configmap中的key的名字,也就是创建configmap时,目录下的文件名
  7. volumes:
  8. - configMap:
  9. name: web-logo-test # 指定configmap
  10. name: liando-logo # 定义此configmap的挂载名字

编辑后,保存退出,容器会自动重启并应用配置。待容器重启成功后,可以自行登录到容器中,查看/opt/orchsym/orchsym-web-3/iconfont/目录是否被覆盖,另外,可以通过对比md5值,来确定是否正常生效。