• spring boot项目生成容器并运行


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

    springboot项目生成容器并运行

    背景

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

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

    问题场景

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

    解决方案

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

    具体实现

    upload.sh

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

    #!/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
    
    • 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

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

    Dockerfile

    需要注意:

    • 生成的镜像的时区问题
    • 约定项目的工作目录
    • 指定JVM的参数
    • 暴露服务的端口号
    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"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    deploy.sh

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

    #!/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
    • 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
    使用方法
    1. 在本地的 src/main/resources 目录下执行 upload.sh
    2. 在服务器上执行 deploy.sh

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

    预期效果

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

    shigen一起,每天不一样!

  • 相关阅读:
    雪花算法详解及源码分析
    MassTransit 入门(一)
    Panda3d 相机控制
    java动态合并表格
    计算机毕业设计Java租车系统(源码+系统+mysql数据库+lw文档)
    Temporal介绍
    02:项目二:感应开关盖垃圾桶
    COCO数据集介绍以及pycocotools简单使用
    Scala基础语法(一)
    C语言 指针——函数指针
  • 原文地址:https://blog.csdn.net/weixin_55768452/article/details/132636411