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一起,每天不一样!

相关推荐
许野平36 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
齐 飞2 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
LunarCod2 小时前
WorkFlow源码剖析——Communicator之TCPServer(中)
后端·workflow·c/c++·网络框架·源码剖析·高性能高并发
码农派大星。3 小时前
Spring Boot 配置文件
java·spring boot·后端
杜杜的man4 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*4 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
llllinuuu4 小时前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s4 小时前
Golang--协程和管道
开发语言·后端·golang
为什么这亚子4 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
想进大厂的小王4 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构