状态:有个k8s tomcat应用 ,pod 启动后,状态由ContainerCreating变为Completed再变为CrashLoopBackOff
一开始以为docker容器问题,又由于在服务器运行,没有权限查看更具体情况。就决定在本地服务器编译、docker build、docker run ,在本地服务器验证没有问题,再在服务器上处理
1、本地编译,下载代码:git clone http://gitlab.testdomain.com/ps_oa_project/ps_oa_bt.git -b master
2、安装maven,配置setting 文件并配置setting文件
3、编译:cd coreoa-proxy ;mvn clean package -pl coreoa-proxy-service -am -Dmaven.test.skip=true
4、由于编译服务器没有安装docker ,把编译后的所有项目文件scp到另外一台安装了docker服务的测试服务器上130.223.212.105
5、下载tomcat镜像,由于安装docker 测试服务器无法连镜像服务器下载tomcat镜像,在容器集群节点上下载,执行命令:
docker login --username=user hub.testdomain.com
docker pull hub.testdomain.com/platform/test-tomcat:v1.0
6、把下载后的镜像导出、传输到测试docker服务器,导入镜像
docker save -o test-tomcat.tar hub.testdomain.com/platform/test-tomcat:v1.0
scp test-tomcat.tar 130.223.212.105:/opt/pmo
在docker测试服务器执行:
docker load -i test-tomcat.tar
7、这样测试服务器本地就有docker基础镜像和编译后的war包等docker build必要文件,其中Dockerfile内容为
FROM hub.testdomain.com/platform/test-tomcat:v1.0
ENV CATALINA_BASE=/opt/pmo/tomcat
ENV CATALINA_HOME=/opt/pmo/tomcat
RUN rm -fr /opt/pmo/tomcat/bin/catalina.sh
COPY coreoa-proxy-service/target/coreoa-proxy.war /opt/pmo/tomcat/webapps/coreoa-proxy.war
COPY catalina.sh /opt/pmo/tomcat/bin/
RUN chmod +x /opt/pmo/tomcat/bin/*.sh
ENTRYPOINT sh /opt/pmo/tomcat/bin/startup.sh
8、只保留Dockerfile前三行,剩余行都注释,docker build 并启动,命令为:
docker build -f Dockerfile -t oa1 .
docker run -d --name oa1 oa1
9、启动后,还是同样失败,针对最少操作还是失败,网上查找,说加个死循环命令,修改Dockerfile内容为:
FROM hub.testdomain.com/platform/test-tomcat:v1.0
ENV CATALINA_BASE=/opt/pmo/tomcat
ENV CATALINA_HOME=/opt/pmo/tomcat
RUN rm -fr /opt/pmo/tomcat/bin/catalina.sh
COPY coreoa-proxy-service/target/coreoa-proxy.war /opt/pmo/tomcat/webapps/coreoa-proxy.war
COPY catalina.sh /opt/pmo/tomcat/bin/
RUN chmod +x /opt/pmo/tomcat/bin/*.sh
ENTRYPOINT sh /opt/pmo/tomcat/bin/startup.sh & while true;do echo hello;sleep 5;done
10、启动后,容器状态能持续为Up状态,说明启动成功了,但是加了个死循环(一般不会这样操作),并且执行docker logs oa1 看不到任何tomcat日志。日志输出的是死循环打印hello,如想要输出tomcat日志,需要像执行死循环一样能在console打印日志。咨询运维同事,说tomcat 有一种console启动,查找一下,启动方式为:sh /opt/pmo/tomcat/bin/catalina.sh run。console启动后,console直接输出日志,于是修改Dockerfile 代码为:
FROM hub.testdomain.com/platform/test-tomcat:v1.0
ENV CATALINA_BASE=/opt/pmo/tomcat
ENV CATALINA_HOME=/opt/pmo/tomcat
RUN rm -fr /opt/pmo/tomcat/bin/catalina.sh
COPY coreoa-proxy-service/target/coreoa-proxy.war /opt/pmo/tomcat/webapps/coreoa-proxy.war
COPY catalina.sh /opt/pmo/tomcat/bin/
RUN chmod +x /opt/pmo/tomcat/bin/*.sh
ENTRYPOINT sh /opt/pmo/tomcat/bin/catalina.sh run
11、重新docker build 和docker run,容器可以持续Up状态,说明状态正常
docker stop oa1
docker rm oa1
docker rmi oa1
docker build -f Dockerfile -t oa1 .
docker run -d --name oa1 oa1
docker ps -a
执行结果:
[root@centos-test coreoa-proxy]# docker ps -a |grep oa1
567d9b6f16a9 oa1 "/bin/sh -c 'sh /opt…" 13 seconds ago Up 12 seconds 8080/tcp oa1
12、修改Dockerfile文件,上传代码库,重新在服务器上编译执行,还是不行,说明k8s 的command 命令覆盖Dockerfile的ENTRYPOINT命令,修改k8s模板命令。重新编译部署,启动正常
由
command: ["sh","-c","/opt/pmo/tomcat/bin/startup.sh"]
修改为:
command: ["sh","-c","/opt/pmo/tomcat/bin/catalina.sh run"]
总结:
1、pod 是否能持续运行,是由执行命令决定的,执行命令如果一执行就停止,控制台也停止持续输出,pod生命周期就结束,pod状态就会变成CrashLoopBackOff
2、docker file 修改的:ENTRYPOINT sh /opt/pmo/tomcat/bin/catalina.sh run ,在k8s里面,会被k8s模板的command 命令覆盖
欢迎加入自动化测试交流QQ群:143535941 ,进群问题回答:testway
欢迎关注技术公众号: