kubernetes安装使用configmap挂载配置文件遇到的问题
问题背景
在容器部署的tomcat应用中文件/usr/local/apache-tomcat-7.0.104/webapps/ROOT/WEB-INF/conf/ds.properties挂载配置成为configmap方便修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| apiVersion: v1 data: ds-properties: |- #for oracle jdbc.jdbcUrl=jdbc:oracle:thin:@//127.0.0.1:1521/orcl jdbc.driverClass=oracle.jdbc.driver.OracleDriver jdbc.username=test jdbc.password=test jdbc.minPoolSize=5 jdbc.maxPoolSize=10 jdbc.validation=SELECT 1 FROM DUAL kind: ConfigMap metadata: name: ds-config namespace: default
volumeMounts: - mountPath:/usr/local/apache-tomcat-7.0.104/webapps/ROOT/WEB——INF/conf/ds.properties name: ds-properties subPath: ds.properties volumes: - configMap: defaultMode: 420 items: - key: ds-properties path: ds.properties name: kess-ds-config optional: false name: ds-properties
|
问题
当挂载完成后发现在tomcat容器内部ROOT目录中只剩下WEB-INF这一个挂载的目录,而其他的目录都不存在,导致服务启动失败
问题分析
刚开始遇到这个问题时考虑可能是subpath设置错误导致,k8s挂载目录出现问题;后面经过测试发现并不是由配置引起
然后发现此业务镜像构建中有拷贝war包这一过程
1 2 3 4 5
| FROM tomcat:test RUN rm -rf /usr/local/apache-tomcat-7.0.104/webapps/* COPY test.war /usr/local/apache-tomcat-7.0.104/webapps/ROOT.war EXPOSE 8080 CMD ["catalina.sh","run"]
|
也就是说usr/local/apache-tomcat-7.0.104/webapps/ROOT/WEB-INF/conf这一目录必须通过tomcat服务器解压war包后才会出现,分析到这里发生问题的原因很清晰了。
由于tomcat解压war包和挂载目录存在一个先后顺序,如果挂载时war包还未开始解压就有可能出现上文编写的错误。
问题解决
修改dockerfile重新构建业务镜像,重新部署后问题解决
1 2 3 4 5
| FROM tomcat:test RUN rm -rf /usr/local/apache-tomcat-7.0.104/webapps/* COPY test /usr/local/apache-tomcat-7.0.104/webapps/ROOT EXPOSE 8080 CMD ["catalina.sh","run"]
|