spring boot项目生成容器并运行

一个安静的周末,shigen又睡懒觉了,上次说的拖延症的惩罚来了:早晚各100个健腹轮练习,早上的已经完成了。今天的文章来的有点晚,但是依旧保持质量。

springboot项目生成容器并运行

背景

将springboot项目打包成jar包,上传到服务器并打包成镜像,运行成docker容器对外提供服务。

这篇文档写于2023年5月25日,现在shigen分享出来,也希望能给开发者提供技术参考。

问题场景

本地的springboot服务编写好代码之后,需要同步到服务器。在服务器上,服务是以容器的形式运行的,所以需要经过以下步骤:

解决方案

  • 效率化首选的shell脚本,使用rsync工具上传jar包到服务器,在服务器使用docker相关的命令进行构建镜像和运行生成容器提供服务

具体实现

upload.sh

本地打包构建服务,生成一个jar包,上传到服务器

bash 复制代码
 #!/bin/zsh
 ​
 # save original file info and show progress
 JAR_FILE_NAME='wx-develop-0.0.1-SNAPSHOT.jar'
 UPLOAD_CMD="
 rsync -e  -avp \
 ./dockerfile \
 ./deploy.sh \
 ../../../target/$JAR_FILE_NAME \
 root@server-ip:/app
 "
 ​
 # maven clean install to ensure the jar is the newest
 mvn clean install -f ../../../pom.xml
 if [ $? -ne 0 ]; then
   echo "maven build failed........."
   exit 1
 else
   echo "now start upload files include $JAR_FILE_NAME"
 fi
 ​
 if [ ! -e ./dockerfile ] || [ ! -e "../../../target/$JAR_FILE_NAME" ]; then
   echo "dockerfile or jar JAR_FILE_NAE not exists"
   exit 1
 fi
 eval $UPLOAD_CMD

后期的优化的话,建议将脚本直接放在项目的根路径下,即与pom.xml在同一级显示。

Dockerfile

需要注意:

  • 生成的镜像的时区问题
  • 约定项目的工作目录
  • 指定JVM的参数
  • 暴露服务的端口号
bash 复制代码
 FROM openjdk:8u302-jdk
 # 作者信息
 MAINTAINER shigen
 # 设置时区
 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
 RUN echo 'Asia/Shanghai' >/etc/timezone
 # 拷贝jar 把可执行jar包复制到基础镜像的根目录下
 ADD ./wx-develop.jar /wx-develop.jar
 # 设置暴露的端口号
 EXPOSE 8088
 # 在镜像运行为容器后执行的命令
 ENTRYPOINT ["java","-jar","wx-develop.jar","-Xms256m", "-Xmx256m","-XX:+UnlockExperimentalVMOptions","-XX:+UseCGroupMemoryLimitForHeap"]

deploy.sh

正如我的脚本注释所说:to run jar as a docker container,即将jar包生成镜像并运行成容器。根据我上文分析的流程进行设计。

bash 复制代码
 #!/bin/bash
 ​
 # this shell is designed to run jar as a docker container
 ​
 # define colors
 RED='\e[1;31m'    # 红
 GREEN='\e[1;32m'  # 绿
 YELLOW='\e[1;33m' # 黄
 BLUE='\e[1;34m'   # 蓝
 PINK='\e[1;35m'   # 粉红
 RES='\e[0m'       # 清除颜色
 ​
 JAR_FILE_NAME='wx-develop-0.0.1-SNAPSHOT.jar'
 DEFAULT_LABEL="wx-develop:`date +%Y%m%d`"
 CONTAINER_PORT='8088/tcp'
 PORT='80'
 ​
 ​
 if [ ! -e ./dockerfile ] || [ ! -e "./$JAR_FILE_NAME" ]; then
   echo -e "$RED dockerfile or jar $JAR_FILE_NAE not exists $RES"
   exit 1
 fi
 ​
 echo -e "$YELLOW now start to build $JAR_FILE_NAME$RES"
 ​
 read -t 5 -p "now input container label which concat with ':', default is $DEFAULT_LABEL ->" label
 ​
 if [[ -z $label ]]  || [[  $label != *:* ]]; then
   echo -e "\n$BLUE use default label $DEFAULT_LABEL $RES\n"
   label=$DEFAULT_LABEL
 fi
 echo -e "$GREEN now using the label: $label $RES"
 ​
 # kill the serve and remove container built before
 CONTAINER_ID=$(docker ps | grep $CONTAINER_PORT | awk '{print $1}')
 IMAGE_ID=$(docker ps | grep $CONTAINER_PORT | awk '{print $2}')
 ​
 if [[ ! -z $CONTAINER_ID ]]; then
   echo -e "$RED now stop container $CONTAINER_ID $RES"
   docker stop $CONTAINER_ID
   docker rm $CONTAINER_ID
 fi
 if [[ ! -z $IMAGE_ID ]]; then
   echo -e "$RED now delete image $IMAGE_ID $RES"
   docker rmi $IMAGE_ID
 fi
 ​
 eval "docker build -t $label ."
 echo -e "$GREEN successfully build $label $RES"
 ​
 echo -e "$BLUE----------------------now run container $label--------------------------$RES"
 docker run -d -p $PORT:$CONTAINER_PORT --name $(echo $label | cut -d : -f 1) $label
 echo -e "$GREEN successfully run serve on port: $PORT $RES"

使用方法

  1. 在本地的 src/main/resources 目录下执行 upload.sh
  2. 在服务器上执行 deploy.sh

😬😬😬😬脚本的文件可以可以放在项目的根路径下,这样避免了在脚本中出现过多的深层相对路径。

预期效果

以上就是今天的文章内容分享了,感谢伙伴们的阅读,觉得不错的话,欢迎点赞、在看、关注、转发哈。

shigen一起,每天不一样!

相关推荐
zopple6 小时前
常见的 Spring 项目目录结构
java·后端·spring
cjy0001118 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
小江的记录本9 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34169 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
程序员cxuan9 小时前
人麻了,谁把我 ssh 干没了
人工智能·后端·程序员
wuyikeer10 小时前
Spring Framework 中文官方文档
java·后端·spring
Victor35611 小时前
MongoDB(61)如何避免大文档带来的性能问题?
后端
Victor35611 小时前
MongoDB(62)如何避免锁定问题?
后端
wuyikeer11 小时前
Spring BOOT 启动参数
java·spring boot·后端
子木HAPPY阳VIP12 小时前
Ubuntu 22.04 VMware 设置固定IP配置
人工智能·后端·目标检测·机器学习·目标跟踪