前述 记录一下比较常用的服务部署方式。
简单粗暴的脚本 这种是本地启动的方式,所以需要自行配置服务器的Java环境。
这个是最简单粗暴的方式了,直接使用java -jar
命令,修改服务名和运行jar包的位置就可以使用了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/bin/bash JAVAHOME=$JAVA_HOME echo "--------start--------" PID=$(ps -ef|grep app-1.0.0.jar |grep -v grep|awk '{print $2}' ) if [ ! $PID ]; then nohup java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -Xms512m -Xmn768m -Xmx1024m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC app-1.0.0.jar > app.log 2>&1 & echo "--------------start success-----------" exit else kill -9 ${PID} echo "--------------kill success-----------" echo "---------------now wait start-------" nohup java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -Xms512m -Xmn768m -Xmx1024m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC app-1.0.0.jar > app.log 2>&1 & echo "--------------start success-----------" exit fi
参数版脚本文件 这是我初步写成的一个脚本文件,只要将该脚本文件和Jar包放入同一个目录下运行即可启动服务。
这种是本地启动的方式,所以需要自行配置服务器的Java环境。
>
其实这个脚本文件多多少少还是有一点问题的,提示信息也不是很美观,但是自己使用还是没什么问题的。
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 #!/bin/bash FOLDER_PATH='' SERVER_NAME='' JAR_NAME='' PID_FILE='' OPTIONS='' LOG_FILE='' usage () { echo "Usage: sh ****.sh [OPTION]... " echo -e "\033[43;37m 注意: 需要添加参数运行,否则无法成功运行 \033[0m" echo -e "\033[43;37m 注意: 需要将本sh文件和jar包放在同一个文件夹 \033[0m" echo "当前OPTION参数有以下几种" echo " --info 查看当前服务信息" echo " --start 启动服务" echo " --stop 停止服务" echo " --restart 重启服务" echo " --status 查询服务运行状态" exit 1 } init () { FOLDER_PATH=$( pwd ) JAR_NAME=$( ls -l |grep .jar | awk '{print$9}' ) SERVER_NAME=$( basename ${JAR_NAME} .jar ) PID_FILE=${SERVER_NAME} \.pid LOG_FILE=${SERVER_NAME} \.log OPTIONS='-Xms256m -Xmx512m' } info () { echo "----------检测是否有Java环境----------" if ! command -v java &> /dev/null then echo "-bash: java: command not found" echo "请检查是安装了Java环境,是否配置了环境变量" else echo "----------当前Java的环境为----------" echo "" echo "$( java -version ) " fi echo "----------当前文件夹路径----------" echo "当前文件夹路径为${FOLDER_PATH} " echo "----------启动服务的信息----------" echo "当前服务名称为${SERVER_NAME} " echo "需要启动的jar包名称为${JAR_NAME} " echo "保存的PID文件名称为${PID_FILE} " echo "保存的LOG文件名称为${LOG_FILE} " echo "----------java -jar的参数----------" echo "当前参数为${OPTIONS} ,需要更改请执行 -setOptions参数进行修改" } is_running () { pid=`ps -ef|grep $JAR_NAME | grep -v grep | awk '{print $2}' ` if [ -n "${pid} " ]; then return 1 else return 0 fi } start () { is_running if [ $? -eq "0" ]; then init echo "服务启动中,请稍后" nohup java ${OPTIONS} -jar ${JAR_NAME} >${LOG_FILE} 2>&1 & echo $! > ${PID_FILE} echo "服务启动成功,当前的PID为$( cat ${PID_FILE} ) " else echo "目标服务正在运行,请勿再次启动" fi } stop () { is_running if [ $? -eq "0" ]; then echo "没有检测到服务启动,请启动之后在尝试" exit 2 fi pid=$(cat ${PID_FILE} ) kill ${pid} rm -rf ${PID_FILE} sleep 1 is_running if [ $? -eq "1" ]; then kill -9 ${pid} fi echo "成功结束${SERVER_NAME} 的进程" } status () { is_running if [ $? -eq "1" ]; then echo "${SERVER_NAME} 服务正在运行中,当前服务的PID为${pid} " else echo "${SERVER_NAME} 服务没有在运行" fi exit 0 } restart () { is_running if [ $? -eq "1" ]; then stop start else echo "当前服务并没有运行,请运行之后在尝试" fi exit 0 } init case "$1 " in "--info" ) info ;; "--start" ) start ;; "--stop" ) stop ;; "--status" ) status ;; "--restart" ) restart ;; *) usage ;; esac exit 0
以下是使用方法
1 2 3 4 5 6 7 8 9 10 11 12 sh start.sh --info sh start.sh --start sh start.sh --stop sh start.sh --status sh start.sh --restart sh start
自动maven打包的Dockerfile 步骤:
拉取Springboot源代码 如果需要自定义maven配置,请添加maven配置文件在目录 修改服务打包生成的JAR包文件名 制作镜像 使用Docker的话,得自行选择需要的JDK镜像和Maven版本镜像,然后修改服务打包出来后的服务名即可。
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 FROM maven:3.8 .1 -openjdk-17 AS builderLABEL stage=builder WORKDIR /app COPY pom.xml . COPY src ./src COPY settings.xml /root/.m2/settings.xml RUN mvn clean package -DskipTests FROM eclipse-temurin:17 -jre-alpineLABEL maintainer="yww@yww52.com" ENV TZ=Asia/ShanghaiRUN apk add --no-cache tzdata && \ ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && \ echo $TZ > /etc/timezone && \ rm -rf /var/cache/apk/* ARG JAR_NAME=app.jarARG JAR_NAME=app.jarENV JAVA_OPTS="-Xms512m -Xmx1536m -Xmn614m -Xss256k -XX:SurvivorRatio=6 -XX:+UseG1GC -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m" ENV APP_HOME=/appRUN adduser -D appuser && \ mkdir -p $APP_HOME && \ chown -R appuser:appuser $APP_HOME USER appuserWORKDIR $APP_HOME COPY --from=builder /app/target/*.jar ${JAR_NAME} EXPOSE 9872 ENTRYPOINT ["sh" , "-c" , "exec java $JAVA_OPTS -jar ${JAR_NAME} " ]
这个制作镜像的方式会有个问题,就是每次制作镜像都需要去跑maven下载依赖,然后打包,时间花费的很多,而且有时候有些maven依赖在仓库上获取不到,所以这种方式适合一些自动化流程,或者是自己搭建Nexus私有仓库来减少下载依赖的时间。 不然的话还是在本地打包后在制作镜像吧,这样更快速。
打包后的Dockerfile 步骤
打包好的JAR包 准备Dockerfile 修改服务打包生成的JAR包文件名 制作镜像 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 33 FROM eclipse-temurin:17 -jre-alpineLABEL maintainer="yww@yww52.com" ENV JAVA_OPTS="-Xms512m -Xmx2048m -Xmn614m -Xss256k -XX:SurvivorRatio=6 -XX:+UseG1GC -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m" ENV APP_HOME=/appARG JAR_NAME=app.jarENV TZ=Asia/ShanghaiRUN apk add tzdata \ && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \ && echo $TZ > /etc/timezone \ && apk del tzdata \ && rm -rf /var/cache/apk/* RUN adduser -D appuser && \ mkdir -p $APP_HOME && \ chown -R appuser:appuser $APP_HOME USER appuserWORKDIR $APP_HOME COPY ${JAR_NAME} $APP_HOME /${JAR_NAME} EXPOSE 9872 ENTRYPOINT ["sh" , "-c" , "java $JAVA_OPTS -jar ${JAR_NAME} " ]