环境:linux 安装docker ,jenkins,maven,java8
首先得有一个maven项目上传到git
Maven聚合项目搭建集成knife4j_aloneTK的博客-CSDN博客
Jenkins的安装步骤(centos7) - 灬百无一用是书生 - 博客园
新建任务
配置git
执行shell
#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/work/glowworm
# 源jar路径
SOURCE_PATH=/var/lib/jenkins/workspace/glowworm/firefly/target
#容器id
CID=$(docker ps | grep "firefly" | awk '{print $1}')
#jar名字
JAR_NAME=firefly-1.0-SNAPSHOT
IMAGE_NAME=firefly
DATE=`date +%Y%m%d%H%M`
# 最新构建代码 移动到项目环境
function transfer(){
echo "最新构建代码 $SOURCE_PATH/$JAR_NAME.jar 迁移至 $BASE_PATH ...."
sudo cp $SOURCE_PATH/$JAR_NAME.jar $BASE_PATH
echo "迁移完成"
}
# 备份
function backup(){
if [ -f "$BASE_PATH/$JAR_NAME.jar" ]; then
echo "firefly-1.0-SNAPSHOT.jar 备份..."
sudo cp $BASE_PATH/$JAR_NAME.jar $BASE_PATH/backup/firefly-$DATE.jar
sleep 3
sudo rm -rf $BASE_PATH/$JAR_NAME.jar
echo "备份 $JAR_NAME.jar 完成"
else
echo "$BASE_PATH/$JAR_NAME.jar 不存在,跳过备份"
fi
}
# 构建docker镜像
function build(){
echo "开始构建镜像..."
cd $BASE_PATH
sudo docker build -t $IMAGE_NAME .
}
# 运行docker容器
function run(){
backup
transfer
build
if [ -n "$CID" ]; then
echo "存在firefly容器,CID=$CID,重启docker容器 ..."
sudo docker stop $CID
sudo docker rm $CID
sudo docker run -d -p 8083:8083 $IMAGE_NAME
echo "firefly容器重启完成"
else
echo "不存在$IMAGE_NAME容器,docker run创建容器..."
sudo docker run -d -p 8083:8083 $IMAGE_NAME
echo "firefly容器创建完成"
fi
}
#入口
run
根目录下新建/work/glowworm文件夹
glowworm下新建backup备份文件夹
glowworm下新建Dockerfile
#基于openjdk:8
FROM openjdk:8
ADD firefly-1.0-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]
然后保存点击立即构建
构建成功
打开浏览器访问
访问成功
这段shell脚本大致流程
a.备份(/work/glowworm/backup)下jar包
cp $BASE_PATH/$JAR_NAME.jar $BASE_PATH/backup/firefly-$DATE.jar
b.项目构建的最新jar包(/root/.jenkins/workspace/docker-test/target/docke-test.jar)移动到项目操作的路径(/work/glowworm)
cp $SOURCE_PATH/$JAR_NAME.jar $BASE_PATH
c.判断docker镜像是否存在,不存在则进入Dockerfile存放的路径(/work/project)执行docker build操作构建名字为docker-test镜像
cd /work/glowworm
docker build -t firefly .
d.判断docker容器是否存在,不存在则执行docker run命令创建容器,存在则docker restart重启容器
docker run --name firefly -v /work/glowworm/:/work/glowworm/ -d -p 8083:8083 firefly
docker restart firefly
docker run参数
--name docker-test 容器的名字为docker-test
-d 容器后台运行
-p 3636:3636 指定容器映射的端口和主机对应的端口都为3636
-v /work/glowworm/:/work/glowworm/ 将主机的/work/glowworm/目录挂载到容器的/work/glowworm/ 目录中(不可少每次本地更新jar包重启容器即可,不用重新构建镜像)
可以在这里加一行这个,因为我发现每构建一次就会生成几个null的镜像 ,空间占用还大
查出来所有为none的镜像id
docker images | grep none | awk '{print $3}'
删除所有镜像名为null的镜像 ,不加 -f会报错:Error response from daemon: conflict: unable to delete 8e6aee9da407 (must be forced) - image is referenced in multiple repositories
使用docker images
可以看到有多个repository引用了这个image id,所以直接删除image ID会报错
#删除所有镜像名为null的镜像
sudo docker images | grep none | awk '{print $3}' | xargs docker rmi -f