通常情况下,容器里的tomcatapp不需要经常启动停止。但在做jenkins自动化测试时,为了更新war包,修改配置什么的,少不了要频繁重启tomcat。tomcat 本身支持远程部署war包,但修改配置他就没辙了。

重启tomcat的方法:

1. jenkins 通过ssh插件,登录到容器,执行重启命令。 这需要为容器配置ssh,配置k8s暴露容器端口,麻烦,也不太安全。

2.在容器里再开一个tomcat,写一个jsp,去执行shell命令,jenkins通过wget 这个url 来启停另一个tomcat。这需要多耗费一份运行tomcat的资源,而且也要配置k8s暴露容器端口,也不好。

jsp执行shell命令示例,还可以传参数:

remotectl.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ page import="java.text.SimpleDateFormat"%>
<%
Runtime   run   =   Runtime.getRuntime();

//new日期对象
Date date = new Date();
//转换提日期输出格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:sss");

String db_username = request.getParameter("db_username");
if(null != db_username){
        Process   pro   =   run.exec("/home/mxb/rc.sh " + db_username);
        out.println(dateFormat.format(date) + " 正在执行:/home/mxb/rc.sh " + db_username +" ...");
        System.out.println(dateFormat.format(date) + " 正在执行:/home/mxb/rc.sh " + db_username + " ...") ;
}else{
        out.println(dateFormat.format(date) + "请指定db_username参数。这是系统要使用的数据库表空间和用户名称,必须为大写。 ");
}
%>


3.写一个脚本monitor.sh,让容器一直运行之,循环检测某个文件是否存在(这个文件可以通过volumeMounts挂载到jenkins和tomcatapp容器里 ),来实现jenkins可控的启停。

这个脚本还可以保持容器一直运行。

rc-myapp.yaml:

apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-myapp
spec:
  replicas: 1
  selector:
    name: myapp
  template:
    metadata:
      labels:
        name: myapp
    spec:
      containers:
        - name: myapp
          image: kimqcn/u14.04
#         command: ["/usr/sbin/sshd","-D"]
#         command: ["/tomcat_rc_9999/bin/catalina.sh","run"]
          command: ["/tomcat/monitor.sh"]
          ports:
#            - containerPort: 22
            - containerPort: 8080
#            - containerPort: 9999


monitor.sh: 在启停tomcat前,先检测一下8080端口,避免重复启动,防止做无用功。

#!/bin/bash

# 本脚本在Docker容器启动时运行。
# 脚本功能:循环(间隔5秒)检测/tomcat/目录下是否存在on文件。
#           如果存在on文件,则启动tomat: /tomcat/bin/startup.sh
#           如果不存在on文件,则停止tomcat: /tomcat/bin/stop_tomcat.sh
# 作者: mxb
# Ver:   2016-03-02

Flag_File=/tomcat/on
while true;do
        if [ ! -f "$Flag_File" ]; then
                echo "`date '+%Y%m%d %H%M%S'` Flag_File检测...不存在! 停止tomcat!" > /dev/null
                netstat -lnp|grep 8080 > /dev/null
                if [ $? -eq 0 ];then
                        echo "`date '+%Y%m%d %H%M%S'` Flag_File检测...不存在! 停止tomcat!"
                        /tomcat/bin/stop_tomcat.sh
                        echo ""
                else
                        echo "tomcat 未启动..,不做操作!" > /dev/null
                fi

                #echo ""
                sleep 5
                continue
        else
             #   echo "`date '+%Y%m%d %H%M%S'` Flag_File检测...存在! 启动tomcat!"
                netstat -lnp|grep 8080 > /dev/null
                if [ $? -eq 0 ];then
                        echo "tomcat 已经启动了..不做操作!" > /dev/null
                else
                        echo "`date '+%Y%m%d %H%M%S'` Flag_File检测...存在! 启动tomcat!"
                        /tomcat/bin/startup.sh
                        echo ""
                fi

                #echo ""
                sleep 5
        fi

done


stop_tomcat.sh:根据端口杀进程

kill -9 $(netstat -tlnp | grep 8080 | awk '{print $7}' | awk -F '/' '{print $1}')

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐