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
# configmap
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

# deployment修改部分
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"]