spring boot项目生成容器并运行

news2024/11/17 15:27:45

一个安静的周末,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

后期的优化的话,建议将脚本直接放在项目的根路径下,即与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"]

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. 在本地的 src/main/resources 目录下执行 upload.sh
  2. 在服务器上执行 deploy.sh

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

预期效果

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

shigen一起,每天不一样!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/963004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2021年03月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:生日相同 2.0 在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。 时间限制:1000 内存限制:65536 输入 第一行为整数n&#xff0c…

Linux系统中u-boot启动流程分析(详解)

大家好,我是ST小智,今天给大家分享一下,u-boot的启动流程。 今天给大家全面的分析一下u-boot启动流程。整理这篇文章花费时间较长,中间很长时间未更新,希望这篇文章对大家有所帮助。 本章主要是详细的分析一下uboot的…

框架分析(8)-React Native

框架分析(8)-React Native 专栏介绍React Native特性和优势跨平台开发:热更新原生性能组件化开发第三方库支持社区支持 限制和挑战性能问题第三方库兼容性学习曲线 总结 专栏介绍 link 主要对目前市面上常见的框架进行分析和总结&#xff0c…

Node基础and包管理工具

Node基础 fs 模块 fs 全称为 file system,称之为 文件系统,是 Node.js 中的 内置模块,可以对计算机中的磁盘进行操作。 本章节会介绍如下几个操作: 1. 文件写入 2. 文件读取 3. 文件移动与重命名 4. 文件删除 5. 文件夹操作 6. …

安圭拉变成AI领域的数字金矿?

这个小小的岛国今年的域名销售额可能达到其GDP的10%! 安圭拉a小小的英国岛屿领土在加勒比海地区,由于其“可再生能源”,今年可能带来高达3000万美元的收入。ai”域名,报告彭博在周四发表的一篇文章中说。在过去的一年里&#xff0…

应届生面试指南:如何在缺乏经验的情况下脱颖而出

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

IMU姿态计算

总述 IMU即惯性测量单元,主要用于对机体的加速度与角速度的测算,使用场景很多,例如: 平衡车、惯性导航等等 姿态 姿态角(Euler angles)是用于描述物体在三维空间中的旋转姿态的一种表示方法。它由三个角度组成&…

微机原理 || 第3次测试:第八章-常用接口芯片82558253(测试题+手写解析)

(一)知识点总结 一直没有学明白8253和8255芯片,觉得后面难,其实看懂后,就是照着表格去对应填写, 知道地址怎么回事就没问题哒~ 相信你😘 一、8255芯片(不是偷懒,真的就…

PMD代码检查:避免抛出原始的异常类型(AvoidThrowingRawExceptionTypes)

https://docs.pmd-code.org/pmd-doc-6.55.0/pmd_rules_java_design.html#avoidthrowingrawexceptiontypes 避免抛出RuntimeException、Throwable、Exception、Error这样原始的异常类型,而应该抛出它们的子类。 例如下面的使用方法PMD检查报违反项: 在…

动态规划之连续乘积最大子数组 连续和最大子数组

一. 连续和最大子数组 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,…

23062day6

作业:将dict.txt导入到数据库中。 方法1:创建shell脚本, 调用指令创建数据库和表格,使用循环在循环中用数组存储dict.txt的内容并插入表格中。 方法2:在终端创建数据库和表格,将dict.txt中的内容手动输入…

OB Cloud 初体验⎮用户之声

OceanBase 作为国内一款优秀的分布式数据库,这些年来发展很快,在金融、电商、政企、物流等行业得到广泛应用。之前多为私有化部署,去年也推出云版本并于最近进行重大升级。受朋友之约,对其云产品做了个简单测试。因时间所限&#…

Django(10)-项目实战-对发布会管理系统进行测试并获取测试覆盖率

在发布会签到系统中使用django开发了发布会签到系统, 本文对该系统进行测试。 django.test django.test是Django框架中的一个模块,提供了用于编写和运行测试的工具和类。 django.test模块包含了一些用于测试的类和函数,如: Tes…

【算法奥义】最大矩形问题

首先建立一个二维数组,这个二维数组,计算出矩阵的每个元素的左边连续 1 的数量,使用二维数组 left记录,其中left[i][j] 为矩阵第 i 行第 j 列元素的左边连续 1 的数量。 也就是从这个元素开始,从右往左边数有多少个连…

一年一度的苹果秋季发布会7个重要议题需回答,看是否有你关心的

当苹果公司举行产品发布会,比如即将于9月12日举行的苹果活动时,这无疑是该公司向我们介绍其最终展示的产品的来龙去脉的机会。但这也是苹果回答一些紧迫问题的机会,不仅是关于其最新的iPhone、Apple Watch和平板电脑,还有关于其作为一家公司的发展方向。 我们将在9月12日的…

iMazing2024绿色版iOS手机备份软件

乍一看,编辑iPhone或iPad的备份似乎是一个奇怪的命题,但实际上这样做的原因有很多,例如在备份数据损坏时进行修复,又如合并来自不同设备的数据。 iMazing对备份文件编辑的支持非常全面,即使备份是加密的、或是横跨不同…

SVN基本使用笔记——广州云科

简介 SVN是什么? 代码版本管理工具 它能记住你每次的修改 查看所有的修改记录 恢复到任何历史版本 恢复己经删除的文件 SVN跟Git比,有什么优势 使用简单,上手快 目录级权限控制,企业安全必备 子目录Checkout,减少不必要的文件检出…

【UIPickerView案例02-点餐显示数据默认选中 Objective-C语言】

一、这个显示数据 1.它里面,有数据源协议、代理协议、以前,TableView里面,怎么用的, 前面我们是怎么做的, 1)第一步:你是不是设置数据, 设置数据源对象、代理对象、然后呢, 然后呢,咱们Main.storyboard,是不是右键, 把这个数据源对象,拖到控制器上 代理对象,…

Mybatis 动态SQL – 使用if,where标签动态生成条件语句

前面几篇我们介绍了使用Mybatis进行数据的增删改查,并且也了解了如何在Mybatis中使用JDK的日志系统打印日志;本篇我们继续介绍如何使用Mybatis提供的if,where标签动态生成条件语句。 如果您对数据的增删改查和Mybatis集成JDK日志系统不太了解&#xff0…

Mysql锁及行锁机制探索

先讲一下mysql存储方式(innodb) 分为,聚簇索引和非聚簇索引。 聚簇索引,就是b树的所有真实数据。 聚簇索引不是一种索引类型,而是一种数据存储方式。innoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。当表有聚簇索引时&…