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

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_NAMEecho "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

在这里插入图片描述


📜文末寄语

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

相关文章:

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

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Docker容器部署Java项目的自动化脚本&#x…...

计组(蒋)期末不挂科纲要

2025.03.27:计算机组成原理期末不挂科速成纲要 计组期末不挂科速成纲要 第1章 概论第2章 数据的机器层次表示习题练习 第3章 指令系统习题练习 第4章 数值的机器运算习题练习 第5章 存储系统和结构习题练习 第6章 中央处理器习题练习 第7章 总线 第1章 概论 冯诺依曼…...

STM32F103C8T6单片机硬核原理篇:讨论GPIO的基本原理篇章1——只讨论我们的GPIO简单输入和输出

目录 前言 输出时的GPIO控制部分 标准库是如何操作寄存器完成GPIO驱动的初始化的? 问题1:如何掌握GPIO的编程细节——跟寄存器如何打交道 问题2:哪些寄存器,去哪里找呢? 问题三,寄存器的含义&#xff…...

UniApp集成极光推送详细教程

最近项目要集成推送服务,选型极光推送,记录一下开发过程。 1、极光官网注册登录 1.1选择极光推送产品,新建应用 1.2在下一步中选择Android/IOS的消息推送服务 1.3产品设置中输入应用包名(一经输入后不可更改,一定要正…...

探索Doris:日志分析的新宠,是否能取代老牌ES?

在大数据时代,日志存储与分析对于企业的运营和决策起着至关重要的作用。Elasticsearch(简称 ES)作为一款广泛应用的开源分布式搜索和分析引擎,长期以来在日志管理领域占据着举足轻重的地位。然而,随着技术的不断发展&a…...

HCIA/HCIP基础知识笔记汇总

HCIA/HCIP基础知识笔记汇总 ICT产业链: 上游:芯片制造、元器件生产、光纤光缆制造 中游:硬件组装、软件开发、网络建设维护 下游:电信服务、互联网服务、终端产品 VLAN端口类型: access :…...

AI战略群与星际之门:软银AI投资版图计划深度解析

一、星际之门:万亿美元级 AI 基础设施革命 1.1 项目背景与战略定位 在 AI 技术迅猛发展的今天,算力已成为推动其前进的核心动力。软银联合 OpenAI、甲骨文、英伟达、微软、arm推出的 “星际之门”(Stargate)计划,无疑是 AI 领域的一颗重磅炸弹。作为 AI 领域史上最大单笔…...

系统思考与时间管理

时间管理的真正秘诀:主动浪费时间? 巴菲特的私人飞机驾驶员觉得自己不够成功,于是向巴菲特请教应该怎么做。巴菲特让他列出了自己人生中最想实现的25个目标,并按重要程度排序,接着安排时间专注做前五件最重要的事情。…...

mac air m系列arm架构芯片安装虚拟机 UTM+debian 浏览器firefox和chrome

成果展示:debian虚拟机,你值得拥有! 预期结果 1、mac的m系列芯片,arm 架构且内存小,安装虚拟机。 考虑到mac m系列芯片8g内存,arm架构想安装一个轻量的虚拟机,偶然之间发现了debian&#xff0c…...

大模预测法洛四联症的全方位研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、法洛四联症概述 2.1 病理特征 2.2 临床表现 2.3 现有治疗手段 三、大模预测法洛四联症的原理与模型构建 3.1 大模预测基本原理 3.2 模型构建的数据收集与处理 3.3 模型训练与优化 四、术前风险预测与准…...

Keepalived+LVS+nginx高可用架构

注明:所有软件已经下载好,防火墙和SELinux已经全部关闭 一.搭建NFS 1.服务端 1.创建文件 [rootnfs ~]# mkdir -p /nfs/data 2、修改权限 [rootnfs ~]# chmod orw /nfs/data 3、写配置文件 [rootnfs ~]# cat /etc/exports /nfs/data 192.168.111.118(r…...

【力扣hot100题】(034)LRU缓存

做完这题已经没有任何力气写链表题了。 思路很简单,就是调试特别的痛苦。 老是频频报错,唉。 class LRUCache { public:struct ListNode{int key,val;ListNode* next; ListNode* prev;ListNode() : key(0), val(0), next(nullptr), prev(nullptr) {}L…...

【redis】缓存 更新策略(定期、实时生存),缓存预热、穿透、雪崩、击穿详解

什么是缓存 redis 最常用的场景 核心思路就是把一些常用的数据,放到触手可及(访问速度更快)的地方 ⽐如我需要去⾼铁站坐⾼铁. 我们知道坐⾼铁是需要反复刷⾝份证的 (进⼊⾼铁站, 检票, 上⻋,乘⻋过程中, 出站…)正常来说, 我的⾝份证是放在…...

好文和技术网站记录

后续不断记录一些本人觉得的好文和一些技术网站 技术网站 Java 全栈知识体系 https://www.pdai.tech/ 文章 利用 NginxKeepalived 实现高可用技术 https://cloud.tencent.com/developer/article/1647182?policyId1004...

使用STM32CubeMX和Keil在STM32上创建并运行一个简单的FreeRTOS多任务程序

目标 利用FreeRTOS运行两个任务,分别为点灯和OLED屏的显示。 利用STM32CubeMX生成Keil工程和相关初始化代码 知识回顾 之前已经利用STM32CubeMX生成过Keil工程和相关初始化代码了,可以去回顾一下,详情见:https://blog.csdn.ne…...

从查重报告入手的精准论文降重秘籍

每个同学在使用论文查重时,为何同一篇文章,可能重复率从10%—30%不等?归根结底还是使用了不同查重系统。其实不同的论文查重与论文AIGC检测系统的算法、数据及模型都不一样,那如何针对这些系统的“个性”精准降重,这篇…...

车辆控制解决方案

车辆控制解决方案 /* * Purpose: 优化车辆控制的功能 -> 用户在控制车辆状态时,实现控制按钮点击状态改变只触发一次onSwitchChange事件,不再下发控制指令,同时清除加载车辆实时状态的定时器status_interval直到有返回值再开启&#xff0…...

【机器学习】嘿马机器学习(算法篇)第14篇:决策树算法,学习目标【附代码文档】

本教程的知识点为:机器学习算法定位、 K-近邻算法 1.4 k值的选择 1 K值选择说明 1.6 案例:鸢尾花种类预测--数据集介绍 1 案例:鸢尾花种类预测 1.8 案例:鸢尾花种类预测—流程实现 1 再识K-近邻算法API 1.11 案例2:预测…...

Uubuntu20.04复现SA-ConvONet步骤

项目地址: tangjiapeng/SA-ConvONet: ICCV2021 Oral SA-ConvONet: Sign-Agnostic Optimization of Convolutional Occupancy Networks 安装步骤: 一、系统更新 检查系统是否已经更新到最新版本: sudo apt-get update sudo apt-get upgra…...

设计模式 三、结构型设计模式

一、代理模式 代理设计模式(Proxy Design Pattern)是一种结构型设计模式,它为其他对象提供了一个代理,以控制对这个对象的访问。 代理模式可以用于实现懒加载、安全访问控制、日志记录等功能。简单来说,代理模式 就是通…...

C语言函数实战指南:从零到一掌握函数设计与10+案例解析(附源码)

一、函数基础:程序的“积木块” (一)什么是函数? 函数是可重复使用的代码块,用于实现特定功能。如同乐高积木,通过组合不同函数,可快速构建复杂程序。例如: #include <stdio.h>// 函数定义:计算两数之和 int add(int a, int b) {return a + b; }int main() {…...

Prompt攻击是什么

什么是Prompt攻击 Prompt攻击(Prompt Injection/Attack) 是指通过精心构造的输入提示(Prompt),诱导大语言模型(LLM)突破预设安全限制、泄露敏感信息或执行恶意操作的攻击行为。其本质是利用模型对自然语言的理解漏洞,通过语义欺骗绕过防护机制。 Prompt攻击的精髓:学…...

【Linux网络#18】:深入理解select多路转接:传统I/O复用的基石

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 目录 一、前言&#xff1a;&#x1f525; I/O 多路转接 为什么需要I/O多路转接&#xff1f; 二、I/O 多路转接之 select 1. 初识 select2. select 函数原型2.1 关于 fd_set 结…...

华院计算3项应用成果入选钢铁行业智能制造解决方案推荐目录(2024年)

近日&#xff0c;中国钢铁工业协会发布《钢铁行业智能制造解决方案推荐目录&#xff08;2024年&#xff09;》。由中国钢铁工业协会、钢铁行业智能制造联盟共同开展了2024年钢铁行业智能制造解决方案及数字化转型典型场景应用案例遴选、智能制造创新大赛&#xff08;钢铁行业赛…...

python使用cookie、session、selenium实现网站登录(爬取信息)

一、使用cookie 这段代码演示了如何使用Python的urllib和http.cookiejar模块来实现网站的模拟登录&#xff0c;并在登录后访问需要认证的页面。 # 导入必要的库 import requests from urllib import request, parse# 1. 导入http.cookiejar模块中的CookieJar类&#xff0c;用…...

vector模拟实现2

文章目录 vector的模拟实现erase函数resize拷贝构造赋值重载函数模版构造及其细节结语 我们今天又见面啦&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路 今天我们来完善vector剩余的内容&#xff0c;以及再探迭代器失效&#xff01; 作者&#xff…...

观察者模式在Java单体服务中的运用

观察者模式主要用于当一个对象发生改变时&#xff0c;其关联的所有对象都会收到通知&#xff0c;属于事件驱动类型的设计模式&#xff0c;可以对事件进行监听和响应。下面简单介绍下它的使用&#xff1a; 1 定义事件 import org.springframework.context.ApplicationEvent;pu…...

详解相机的内参和外参,以及内外参的标定方法

1 四个坐标系 要想深入搞清楚相机的内参和外参含义&#xff0c; 首先得清楚以下4个坐标系的定义&#xff1a; 世界坐标系&#xff1a; 名字看着很唬人&#xff0c; 其实没什么大不了的&#xff0c; 这个就是你自己定义的某一个坐标系。 比如&#xff0c; 你把房间的某一个点定…...

在线sql 转 rust 模型(Diesel、SeaORM),支持多数据 mysql, pg等

SQL 转 Rust 在 Rust 语言中&#xff0c;常用 Diesel 和 SeaORM 进行数据库操作。手写 ORM 模型繁琐&#xff0c;gotool.top 提供 SQL 转 Diesel、SeaORM 工具&#xff0c;自动生成 Rust 代码&#xff0c;提高开发效率。 特色 支持 Diesel / SeaORM&#xff0c;生成符合规范…...

高并发内存池(二):Central Cache的实现

前言&#xff1a;本文将要讲解的高并发内存池&#xff0c;它的原型是Google的⼀个开源项⽬tcmalloc&#xff0c;全称Thread-Caching Malloc&#xff0c;近一个月我将以学习为目的来模拟实现一个精简版的高并发内存池&#xff0c;并对核心技术分块进行精细剖析&#xff0c;分享在…...