当前位置: 首页 > news >正文

Docker容器部署Java项目的自动化脚本(Shell编写)

🤟致敬读者

  • 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉

📘博主相关

  • 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息

文章目录

  • Docker容器部署Java项目的自动化脚本(Shell编写)
    • 1. 服务部署过程
      • 1.1 移除旧jar包
      • 1.2 jar包更新
      • 1.3 停止旧容器
      • 1.4 删除旧容器
      • 1.5 删除旧镜像
      • 1.6 构建新镜像
      • 1.7 运行新容器
    • 2. 创建shell脚本文件
      • 2.1 本地创建并上传到服务器
      • 2.2 服务器中创建sh文件
    • 3. 脚本内容
      • 3.1 简易脚本
      • 3.2 升级脚本
    • 4. 执行脚本
      • 4.1 检查脚本
      • 4.2 执行脚本
      • 4.3 报错处理
    • 5. 查看镜像
    • 6. 查看容器


📃文章前言

  • 🔷文章均为学习工作中整理的笔记。
  • 🔶如有错误请指正,共同学习进步。

Docker容器部署Java项目的自动化脚本(Shell编写)

1. 服务部署过程

先将Java项目在docker中部署的过程中所有命令列举
命令均在jar包同级目录下进行执行

1.1 移除旧jar包

正常应该会在更新时覆盖,但还是执行以下删除操作

rm -f app.jar

1.2 jar包更新

通过oss工具命令线上更新或者ftp工具上传更新

这里使用oss工具(使用ftp工具上传可省略这一步更新操作)

ossutil64 cp oss://sb-dev/sb_back/app.jar app.jar

1.3 停止旧容器

先停止原来的容器

docker stop sb_back

1.4 删除旧容器

删除原来的容器

docker rm sb_back

1.5 删除旧镜像

检索并删除原来的镜像

docker rmi sb_back:20250327

1.6 构建新镜像

构建新的镜像

docker build -t sb_back:20250327 .

参数描述
build 构建命令
-t 打标签,TAG的缩写
sb_back:20250327 镜像名称和TAG
. 当前目录下

1.7 运行新容器

运行新的容器,自定义名称,指定端口映射

docker run --name sb_back -p 3006:8089 -d --restart=always sb_back:20250326

参数描述
run 运行容器命令
–name 定义容器名称,这里定为sb_back
-p 映射端口,将Java服务端口即容器端口映射到本机服务器向外暴露的端口(即后续访问该服务的真实端口)
-d 后台运行
–restart=always 容器运行失败会自动重启
sb_back:$DATE 镜像及TAG(使用指定镜像来运行容器)

2. 创建shell脚本文件

可以在本地创建后上传到服务器或者在服务器jar包同级目录创建

2.1 本地创建并上传到服务器

先在本地编辑(VSCode等编辑器创建一个sb_back.sh文件),将脚本内容粘贴进来并保存
在这里插入图片描述

使用FTP工具或者oss工具上传

ossutil64 cp oss://sb-dev/sb_back/sb_back.sh sb_back.sh

注意,由于Windows和Linux换行符不同,脚本上传后执行可能会报错,可参考4.3进行解决

在这里插入图片描述

2.2 服务器中创建sh文件

在jar包同级目录下创建名为sb_back.sh的文件

mkdir sb_back.sh

编辑文件

vim sb_back.sh

将脚本内容粘贴进来即可
(i开启输入模式,esc推出输出模式,:wq保存并退出)

3. 脚本内容

将以上名命令整合到一起就是脚本执行的命令,完整内容如下

3.1 简易脚本

停止容器、移除原有容器和镜像,构建镜像并部署容器的脚本命令

#!/bin/bash
# 1. 停止并删除旧容器
echo "Stopping and removing old container..."
docker stop sb_back || true
docker rm sb_back || true
# 2. 删除旧镜像(可选,强制重新构建时使用)
echo "Removing old image..."
docker rmi $IMAGE_NAME || true
# 3. 构建新镜像
echo "Building new image..."
docker build -t $IMAGE_NAME $DOCKERFILE_PATH
docker build -t sb_back:20250327 .
# 4. 运行新容器
echo "Starting new container..."
docker run -d --name sb_back -p 3006:8089 --restart=always sb_back:20250327
echo "Deployment completed!"

注:|| true 用于忽略未找到容器的错误

3.2 升级脚本

移除jar包,上传jar包,停止容器、移除容器和镜像、构建镜像和运行容器等命令整合
并且将容器名镜像名等以变量的形式传入
其中以时间变量作为镜像TAG

#!/bin/bash
# 定义当前日期,后续使用日期作为镜像TAG版本
DATE=$(date +%Y%m%d)
# 定义当前时间
CURRENT_TIME=`date +'%Y%m%d_%H%M%S'`
# 或者
# CURRENT_TIME=(date +%Y%m%d_%H%M%S)

# 输出当前时间内容
echo "DATE = "$DATE
echo "CURRENT_TIME = "$CURRENT_TIME

# 0. 移除旧jar包,放入新的jar包
echo "Removing jar and copy new jar..."
rm -f app.jar
ossutil64 cp oss://dev/3_JWH/01_SB_BACK/app.jar app.jar

# 部署配置(根据实际情况修改)
CONTAINER_NAME="sb_back"  # Docker容器名称
IMAGE_TAG=$DATE
IMAGE_NAME=$CONTAINER_NAME:$IMAGE_TAG      # Docker镜像名称
# JAR_PATH="./target/*.jar"       # 生成的Jar包路径
DOCKERFILE_PATH="."             # Dockerfile所在目录,jar包和dockerfile文件在同一位置
PORT_MAPPING="3006:8089"        # 端口映射, Java服务端口8089映射到本机服务器3006,外部访问时访问的就是3006端口

# 1. 停止并删除旧容器
echo "Stopping and removing old container..."
docker stop $CONTAINER_NAME || true
docker rm $CONTAINER_NAME || true

# 2. 删除旧镜像(可选,强制重新构建时使用)
echo "Removing old image..."
docker rmi $IMAGE_NAME || true

# 3. 构建新镜像
echo "Building new image..."
docker build -t $IMAGE_NAME $DOCKERFILE_PATH

# 4. 运行新容器
echo "Starting new container..."
docker run -d \
  --name $CONTAINER_NAME \
  -p $PORT_MAPPING \
  --restart=always \
  $IMAGE_NAME

echo "Deployment completed!"

4. 执行脚本

4.1 检查脚本

执行前可先检查以下脚本内容

cat sb_back.sh

在这里插入图片描述

4.2 执行脚本

在脚本所在目录,执行命令

sh sb_back.sh

注意:由于Windows中的换行符和Linux环境中的有所不同,可能会导致sh脚本执行报错,如报错可参考下一步解决
执行截图
在这里插入图片描述

4.3 报错处理

如果报错可先执行以下命令将替换Windows中的换行符为Linux的换行符

sed -i 's/\r$//' your_script.sh

更多解决方案参考文章:Error: context must be a directory: “/root/xxxx/.\r“(Docker构建镜像运行容器脚本出现换行符问题的解决)

5. 查看镜像

执行脚本后,使用命令查看镜像是否更新

docker images

在这里插入图片描述

6. 查看容器

查看容器是否已经创建并运行
查看正在运行的容器

docker ps

在这里插入图片描述


📜文末寄语

  • 🟠关注我,获取更多内容。
  • 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
  • 🟢《全栈知识库》技社区,集结全栈各领域开发者,期待你的加入。
  • 🔵​加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
  • 🟣点击下方名片获取更多内容🍭🍭🍭👇

http://www.dtcms.com/a/107274.html

相关文章:

  • 动态规划练习题①
  • 蓝桥杯 web 灯的颜色变化(Dom操作及样式动态修改、浏览器解析顺序、定时器)
  • 计算机科学基础设施之数学:科研工具、资源与环境详介
  • qt.qpa.xcb: could not connect to display解决方法
  • Keil5烧录后STM32不自动运行?必须复位才能启动的终极解决方案
  • element-plus中,Upload上传组件的使用 + 后端处理
  • DMA在SPI和I2C通信中的应用详解
  • 解锁异步编程新姿势:CompletableFuture 深度探秘
  • java根据集合中对象的属性值大小生成排名
  • [NOIP 1999 提高组] 导弹拦截
  • C++ STL简单的几个容器
  • I²C总线高级特性与故障处理分析
  • 【leetcode100】每日温度
  • OpenCV 从入门到精通(day_04)
  • 面向对象
  • python实现简单fast-cgi服务,对接到nginx
  • 蓝桥云客 刷题统计
  • 持续集成与Jenkins安装使用教程
  • 分布式锁方案-Redisson
  • Linux命令-tar
  • 使用 MapReduce 进行高效数据清洗:从理论到实践
  • Linux内核中ARP协议的实现与dev_addr字段的作用
  • LabVIEW 调用 Python 函数
  • SAP-ABAP:ABAP `LEAVE LIST-PROCESSING` 深度解析
  • 天梯赛 L2-023 图着色问题
  • ai prompt工程师认证
  • AT_abc306_b [ABC306B] Base 2
  • 【工具变量】全国分省低空经济高质量发展数据(2012-2023年)
  • Word 插入无页眉页码的空白页(即插入奇数页)
  • WebSocket connection failed 解决