文章目录
- 普通方式的springboot 使用docker打包发布【手动构建镜像模式】
- 1. maven 打包可运行jar包
- 2.手动打包镜像
- 3.运行容器
- 全自动化本地命令发布到远程服务的方式
- 配置ssh信任公钥
- 获取公钥
- git 获取公钥方式: 桌面右键 -> open git gui here -> help -> show SSH key
- 命令生成公钥方式
- 将公钥配置到服务器可信公钥中
- 调用脚本实现
- 服务器上自动更新代码并打包发布
专栏快速目录链接
【JAVA WEB实用与优化技巧】Maven自动化构建与Maven 打包技巧
【JAVA WEB实用与优化技巧】如何自己封装一个自定义UI的Swagger组件,包含Swagger如何处理JWT无状态鉴权自动TOKEN获取
【JAVA WEB实用与优化技巧】如何使用本地脚本调用远程服务使用docker快速发布java应用?
我们平时都是走jenkins或者是openshift这种k8s平台来打包java应用,但对于小项目来说部署jenkins和openshift消耗的精力很多,并且如果我们是小型项目的话,在测试环境根本用不到这种发布方式,特别是一个人开发后端的情况我们希望服务器能够快速响应发布,快速进行调试。那么如何通过本地命令直接将应用发布到服务器呢?比如:本地运行deploy.bat 直接就能发布项目到测试环境,且所有的流程都是自动化的。
普通方式的springboot 使用docker打包发布【手动构建镜像模式】
1. maven 打包可运行jar包
通过命令可以打包得到可运行的jar包,具体如何详细打包技巧可查看 【JAVA WEB实用与优化技巧】Maven自动化构建与Maven 打包技巧 来学习。这里只讲述如何使用命令快速打包发布。
mvn clean package -s /path/to/aliyun.setting.xml -DskipTests=true
打包之后可以在启动类并且配置了打包插件的module找到打包过后的jar包,这里不再过多赘述打包细节。下述是springboot打包得插件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
项目的目录结构如下:
运行命令之后可以犯下target下会产生打包的jar包。
2.手动打包镜像
拿到jar包之后,将jar包放到 /docker/service/
下面:
在/docker/service/
目录下新建Dockerfile文件
touch Dockerfile
Dockerfile
配置信息:
FROM openjdk:8-jre # 原始镜像
MAINTAINER jag <xxx@163.com> # 作者
ENV JAVA_OPTS="-Dspring.profiles.active=sit" # 指定JVM参数
ADD xxx-boot-1.0-SNAPSHOT.jar app.jar # 将jar包add到镜像文件夹中 -> app.jar 代表放到根目录下
RUN mkdir /logs && sh -c "chmod -R 777 /logs" # 修改日志文件夹的权限
EXPOSE 8080 # 暴露端口
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar # docker 容器启动的时候运行的命令
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone # 设置时区
然后运行docker build -t "notes:v1.0" 【dockerfile所在路径】
即可将jar包打成镜像。
3.运行容器
docker run -v /docker/logs:/logs -d -p 9000:8080 --name=vnode-1.0 notes:v1.0
这样发布需要的步骤为:
- 将打包好的jar包拷贝到服务器上
- docker build 将jar包打成镜像
- 运行
明显是非常麻烦的,我们如何将这三步变成一步直接运行本地的一个脚本就能直接发布呢?并且如何做到可以自动清理过期的docker容器和镜像呢?
全自动化本地命令发布到远程服务的方式
配置ssh信任公钥
配置信任公钥之后我们在本地就可以直接调用测试服务器上的命令了。
获取公钥
git 获取公钥方式: 桌面右键 -> open git gui here -> help -> show SSH key
=> copy to clipboard 来拿到公钥
如果还没有公钥生成一下公钥再拷贝即可。
命令生成公钥方式
id_rsa.pub就是公钥串文件,编辑器打开复制即可。如果之前已经生成了,直接拷贝id_rsa.pub中的内容即可。
将公钥配置到服务器可信公钥中
vi ~/.ssh/know_hosts
将本地的公钥粘贴进去,wq
退出保存即可。
调用脚本实现
jarpush.bat
调用打包脚本先服务打包,然后将打包得jar scp 到远程linux服务上
@echo off
setlocal
call .\package.bat
set FILE_PATH=\path\to\efficiency-note-boot-1.0-SNAPSHOT.jar
set USERNAME=root
set SERVER_IP=47.98.213.209
set REMOTE_DIR=/docker/service
echo Uploading file to Linux server...
echo %FILE_PATH% %USERNAME%@%SERVER_IP%:%REMOTE_DIR%
scp %FILE_PATH% %USERNAME%@%SERVER_IP%:%REMOTE_DIR%
echo File upload completed.
ssh root@47.98.213.209 "bash /docker/service/service_build.sh"
endlocal
package.bat
@echo off
JAVA_HOME=D:\java\jdk1.8.0_131
java -version
D:\maven\apache-maven-3.9.6\bin\mvn clean package -s D:\maven\aliyun.setting.xml -DskipTests=true
@echo off
service_build.sh
#!/bin/bash;
VERSION=`cat /docker/service/version`
echo "关闭容器"
docker stop NC_$VERSION
# 获取名称以"notes"开头的容器ID列表
container_ids=$(docker ps -aq --filter "name=NC_*")
echo 'rongqi'$container_ids
if [ -z "$container_ids" ]; then
echo "No containers found with 'notes' in the name."
else
# 删除容器
docker rm $container_ids
fi
# 获取名称为"notes"的镜像ID列表
image_ids=$(docker images -q "notes*")
if [ -z "$image_ids" ]; then
echo "No images found with 'notes' in the name."
else
# 删除镜像
docker rmi $image_ids
fi
echo $VERSION
((VERSION++))
docker build -t "notes:v$VERSION" /docker/service/
docker run -v /docker/logs:/logs -d -p 9000:8080 --name=NC_$VERSION notes:v$VERSION
echo $VERSION > /docker/service/version
/docker/service/
目录下的Dockerfile:
FROM openjdk:8-jre # 原始镜像
MAINTAINER jag <xxx@163.com> # 作者
ENV JAVA_OPTS="-Dspring.profiles.active=sit" # 指定JVM参数
ADD xxx-boot-1.0-SNAPSHOT.jar app.jar # 将jar包add到镜像文件夹中 -> app.jar 代表放到根目录下
RUN mkdir /logs && sh -c "chmod -R 777 /logs" # 修改日志文件夹的权限
EXPOSE 8080 # 暴露端口
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar # docker 容器启动的时候运行的命令
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone # 设置时区
我们在本地点击jarpush.bat 运行即可发布到测试环境上了。
服务器上自动更新代码并打包发布
如果我们不想在本地打包推送到服务器上发布,可以使用git先拉去代码然后运行mvn命令打包然后再发布
publish.sh
#!/bin/bash
MAVEN_HOME=/docker/apache-maven-3.8.8/bin/
cd /docker/service/efficient-notes && git pull origin master
pwd
$MAVEN_HOME/mvn clean package -s /docker/service/setting.xml -Dmaven.test.skip=true
cd /docker/service && cp /docker/service/projectName/xxx-main/xxx-boot/target/xxx-boot-1.0-SNAPSHOT.jar /docker/service
sh /docker/service/service_build.sh
git pull origin master => 可能会需要账号和密码,使用下述命令来保存账号密码第二次发布就不需要填写密码了,就可以自动拉取代码。
git config --global credential.helper store // 保存账号密码
然后本地的.bat或者.sh通过ssh调用远程publish.sh
脚本即可。