springboot集成docker实现自动化构建镜像说明
springboot集成docker实现自动化构建镜像说明
文档说明
该文档仅包括通过配置springboot、docker、jenkins、git、appollo等实现持续构建,持续发布的功能,不包括各个组件使用细节的讲解。
环境说明
name version desc spring boot 2.0.2.RELEASE spring boot docker 1.13.1 docker harbor 1.7.0 镜像仓库 jenkinsci/blueocean 1.9.0 jenkins的blueocean工具 maven 3-alpine maven gitlab 10.2.3 gitlab 自动化构建的构想图
springboot配置文件- 包括测试服和正式服两套服务,所以需要添加两套配置文本
- 在
resources下面添加application-test.properties文本,内容同测试服的配置。 - 在
resources下面添加application-prod.properties文本,内容同slave10的配置。 - 对于
test和prod的指定通过jvm参数-Dspring.profiles.active=test。
日志配置
- 日志文件保存地址统一为
/var/log/jenkinsci/zsm-eprofile/eprofile.2019-01-02.log - 将镜像的
/var/log/jenkinsci/zsm-eprofile挂载到宿主机上对应的目录/var/log/jenkinsci/zsm-eprofile。这样方便随时对日志监控。 - 对
logback配置示例<property name="LOG_HOME" value="/var/log/jenkinsci/zsm-eprofile/logs" />
- 日志文件保存地址统一为
pom打包方式修改在
pom的build下面将打包方式修改为如下。<properties>
<docker.image.prefix>bigdata-test.server.com</docker.image.prefix>
</properties>
<plugins>
<!--这个插件是将所有的包打在一起-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<!-- 这个插件主要是对打的包解压到dependency目录下 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<!-- 根据 dockerfile 构建镜像的mvn插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.9</version>
<configuration>
<!-- 镜像名 -->
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<!-- tag:默认使用当前版本 -->
<tag>${project.version}</tag>
</configuration>
</plugin>
</plugins>注意:如果在build标签下面有下面的配置,需要删除或者其他处理,要保证配置文件都能够打包到jar里面
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/**</include>
</includes>
</resource>
</resources>
在打包的
pom文件同级目录下创建Dockerfile文件Dockerfile内容##FROM指定依赖jdk8这个镜像,VOLUME指定其挂载目录
FROM openjdk:8-jdk-alpine
VOLUME /tmp
##将dependency下面的内容拷贝到容器中
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
##容器启动时通过PARAMS指定jvm参数
ENV PARAMS=""
## apk源
RUN data="" \
&& sed -i 's/http:\/\/dl-cdn.alpinelinux.org\/alpine\//'"http:\/\/hub-mirror.c.163.com\/alpine\/"'/g' /etc/apk/repositories
## 字体包
RUN set -xe \
&& apk --update add ttf-dejavu fontconfig
## 容器启动时执行的命令
ENTRYPOINT ["sh","-c","java -cp app:app/lib/* $PARAMS com.zsm.test.Application"]说明
上面是一种的构建镜像的方式:这种方式是将jar解压之后分别拷贝lib和class到容器中,这种方式能够灵活的对历史版本镜像进行配置修改等操作,方便镜像在不同服务器之间的迁移。还有另外一种,直接将整个jar拷贝到容器中:这种方式构建简单,但是将配置打包到jar里面,不方便对配置的修改。
com.zsm.test.TestImageApplication每个项目对应的主类不一样,需要进行修改。
在打包的
pom文件同级目录下创建JenkinsfileJenkinsfile内容pipeline {parameters {booleanParam(name:'UPDATE_FORMUL', defaultValue:false,description:'默认false:不更新正式服; true:更新正式服')
booleanParam(name:'NOT_SKIP_BUILD', defaultValue:true, description:'默认true:构建新的镜像;false:跳过镜像构建')
}
environment {BITBUCKET_COMMON_CREDS = credentials('docker-registry-up')RegistryName = 'bigdata-test.server.com'
ImageName = 'test.zsm.com/enterprise-image'
ImageTag = '1.0.1'
}
agent any
stages {stage('Build') {when {expression { return params.NOT_SKIP_BUILD }}
agent {docker {image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
steps {echo '开始mvn构建镜像...'
sh 'cd .'
sh 'mvn -B -DskipTests clean package dockerfile:build'
echo '镜像构建完成!'
}
}
stage('Push') {when {expression { return params.NOT_SKIP_BUILD }}
steps {echo 'push镜像到私有仓库...'
sh 'docker login -u $BITBUCKET_COMMON_CREDS_USR -p $BITBUCKET_COMMON_CREDS_PSW $RegistryName'
sh 'docker tag $RegistryName/$ImageName:$ImageTag $RegistryName/$ImageName:latest'
sh 'docker push $RegistryName/$ImageName:$ImageTag'
sh 'docker push $RegistryName/$ImageName:latest'
sh 'docker rmi $RegistryName/$ImageName:$ImageTag'
sh 'docker rmi $RegistryName/$ImageName:latest'
echo 'push镜像到私有仓库完成!'
}
}
stage('Pull_Test') {steps {echo '开始更新测试服...'
sh 'ssh root@bigdata02 "/opt/server/zsm-microservice/jenkins-remote-shell/zsm-eprofile.sh"'
echo '测试服更新完成!'
}
}
stage('Pull_Formal') {when {expression { return params.UPDATE_FORMUL }}
steps {echo '开始更新正式服...'
sh 'ssh bigdata@10.0.100.154 "/opt/server/zsm-microservice/jenkins-remote-shell/zsm-eprofile.sh"'
echo '正式服更新完成!'
}
}
}
}
说明
- 这个文件对每次版本的变动都需要修改
ImageTag为对应的版本。 - 注意:这个文件里面不能写注释。
- 对于在项目的
module下打包的情况,需要把stage('Build')下面的steps里面的sh 'mvn -B -DskipTests clean package dockerfile:build -f pom.xml'改为对应的module下面。 Jenkins的pipline语法有Scripted Pipeline和Declarative Pipeline两种,这里使用的是声明式pipline。pipline语法详情。
- 这个文件对每次版本的变动都需要修改
gitlab项目设置- 添加为可访问gitlab仓库的账号信息。
- 通过
setting->members->add member的方式添加。
Jenkins配置jenkins访问地址:http://192.168.1.100:8080,账号密码:admin/123456jenkins pipline创建流程:new任务->enter an item name->流水线->ok.pipline->definition->pipline script from SCM->SCM->git->Repository url->credentials->jenkins-gitlab-private->输入分支,默认master分支->save。- 如果
Jenkinsfile在module下面,请在Script Path指定对应的path
远端服务器脚本
因为镜像的
pull和run都是通过Jenkins调用远程的shell脚本来执行的,所以需要编写对应的脚本。所以对于正式服和测试服的每一台服务器都需要对应的脚本。脚本内容
#!/bin/bash
docker login -u admin -p 123456 bigdata-test
docker stop zsm-eprofile
docker rm -f zsm-eprofile
docker rmi bigdata-test.server.com/test.zsm.com/enterprise-image:latest
docker pull bigdata-test.server.com/test.zsm.com/enterprise-image:latest
docker run -d -p 9210:9210 -v /etc/hosts:/etc/hosts -v /var/log/jenkinsci/zsm-eprofile:/var/log/jenkinsci/zsm-eprofile --name zsm-eprofile -e PARAMS='-Dspring.profiles.active=test -Djava.security.egd=file:/dev/./urandom' --net=host bigdata-test.server.com/test.zsm.com/enterprise-image:latest
说明:
- 停止容器和删除容器需要把名字和容器启动的名字保持一致。
- 删除镜像和pull镜像需要改为自己项目构建的镜像,tag使用latest不变。
- 运行新的镜像里面需要把
-v /var/log/jenkinsci/zsm-eprofile:/var/log/jenkinsci/zsm-eprofile日志输出改为自己项目对应的地址,--name zsm-eprofile也需要改成自己项目的名字(和停止删除容器的名字保持一致),-e PARAMS='-Dspring.profiles.active=test -Djava.security.egd=file:/dev/./urandom'用来指定jvm运行参数。
手动构建
Jenkins pipline- 进入项目对应的任务,
立即构建->build history->查看构建日志。
- 进入项目对应的任务,
不足
- 目前使用的是手动构建方式进行任务的启动,后期优化成每一个项目都在git上有对应的生产分支,
jenkins只需要webhook对应的生产分支就行。 - 对于程序的版本和镜像打包的tag,必须保持一致才能有效,版本的迭代每次需要改动两个地方,有点麻烦。
- 目前使用的是手动构建方式进行任务的启动,后期优化成每一个项目都在git上有对应的生产分支,
zsm_test_jenkins.sh 脚本
#!/bin/bash
ssh root@bigdata01 "/opt/server/zsm-microservice/jenkins-remote-shell/zsm_test_jenkins.sh"
sudo docker login -u admin -p 123456 bigdata-test
sudo docker stop zsm_test_jenkins
sudo docker rm -f zsm_test_jenkins
sudo docker rmi bigdata-test.server.com/test.zsm.com/zsm_test_jenkins:latest
sudo docker pull bigdata-test.server.com/test.zsm.com/zsm_test_jenkins:latest
sudo docker run -d -p 9060:9060 -v /etc/hosts:/etc/hosts -v /var/log/jenkinsci/zsm_test_jenkins:/var/log/jenkinsci/zsm_test_jenkins --namezsm_test_jenkins -e PARAMS='-Dspring.profiles.active=test -Dapollo.configService=http://bigdata-test:8090 -Djava.security.egd=file:/dev/./urandom' --net=host bigdata-test.server.com/test.zsm.com/zsm_test_jenkins:latest
springboot集成docker实现自动化构建镜像说明的更多相关文章
- 使用Docker搭建Jenkins+Docker持续集成环境(自动化构建发布部署)
本文介绍如何通过Jenkins的docker镜像从零开始构建一个基于docker镜像的持续集成环境,包含自动化构建.发布到仓库\并部署上线. 0. 前置条件 服务器安装docker,并启动docker ...
- Docker build Dockerfile 构建镜像 - 二
Dockerfile 制作镜像 https://hub.docker.com/ 搜索需要镜像: https://hub.docker.com/_/centos/ 官方示例: centos:6 1.这里 ...
- Docker的自动构建镜像
Dockerfile自动构建docker镜像类似ansible剧本,大小几kb手动做镜像:大小几百M+ dockerfile 支持自定义容器的初始命令 dockerfile主要组成部分: 基础镜像信息 ...
- Docker镜像构建原理解析(不装docker也能构建镜像)
在devops流程里面 构建镜像是一个非常重要的过程,一般构建镜像是写dockerfile文件然后通过docker client来构建的image. docker client 会先检查本地有没有im ...
- Docker学习(7) 构建镜像
构建docker镜像 1 构建镜像的两种方式 1 通过容器构建镜像 2 通过Dockerfile构建镜像
- 在Centos7下docker配置自动化环境镜像(python3.7+selenium 3.11+firefox 62+geckodriver 0.21)
最近在学习Docker,准备做自动化测试代码集成的功能.如下文章的前提是已经安装好linux系统,且成功安装好Docker. 接下来我会按步骤一步一步的对自动化需要的一些环境进行安装,如果没有特别说明 ...
- docker commit理解构建镜像(7)
镜像是多层存储,每一层是在前一层的基础上进行的修改: 而容器同样也是多层存储是在以镜像为基础层,在基础层上加一层作为容器运行时的存储层. 当我们使用Docker Hub的镜像无法满足我们的需求时,我们 ...
- 【云原生 · Kubernetes】Jenkins+Gitlab+Rancher+Docker 实现自动构建镜像的 CI 平台(一)
1 准备 Jenkins+Gitlab 实验环境 1.1 准备实验环境:恢复到以一下快照:该环境已经配置好 jenkins+gitlab+sonar-配置通 主机角色: IP 地址 运行的服务 硬件配 ...
- SpringCloud+Git+Maven+Docker+Jenkins自动化构建
1.JDK安装-OpenJDK安装 yum list java-1.8* yum install -y java-1.8.0-openjdk-devel.x86_64 PS: JDK安装有两种方法:一 ...
- springboot docker jenkins 自动化部署并上传镜像
springboot + docker + jenkins自动化部署项目,jenkins.mysql.redis都是docker运行的,并且没有使用虚拟机,就在阿里云服务器(centos7)运行 1. ...
随机推荐
- biancheng-Django(python)
http://c.biancheng.net/django/ Django MTV和MVC的区别 1. MVC设计模式 我们先对 MVC 设计模式进行介绍,它是 Web 设计模式的经典之作,MTV 模 ...
- runoob-Lua 教程
https://www.runoob.com/lua/lua-tutorial.html Lua 特性 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里. ...
- MQ的定时任务改装,实现自定义定时:MQ+redis
package com.*.server.live.listener; import com.*.common.core.entity.constant.LiveConstant; import co ...
- http 协议请求响应模型
http 协议请求响应模型(一次请求生命周期或简单的软件分层) 场景: 登录 1.客户端发起请求到api接口层 1.1用户在客户端填写用户名和密码,点击登录,发送请求. 2.api接收到客户端发起的用 ...
- GD32F103C8T6看门狗
GD32F10x看门狗 两个看门狗设备(独立看门狗IWDG和窗口看门狗WWDG)可用来检测和解决由软件错误引起的故障: 当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位. ...
- Linux重要的日志文件
1./var/log/boot.log 该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息 2./var/log/syslog 只记录警告信息,常常是系统出问题的信息,所 ...
- Hetao P1156 最大战力 题解 [ 绿 ][ 二分 ][ 最大子段和 ]
最大战力 Vjudge 原题 题解 形式化题意 给定两个数组 \(a[n]\) 和 \(b[n]\) ,需要在数组 \(b\) 中选择一个区间 \(b[l,r]\) ,替换掉区间 \(a[l,r]\) ...
- Ubuntu Linux部署DeepSeek(转载用于学习)
合集 - DeepSeek(4) 1.Ubuntu Linux部署DeepSeek02-06 2.Windows11本地部署DeepSeek加速02-073.DeepSeek部署本地知识库02-084 ...
- FreeSql学习笔记——1.入门
前言 学习过程中,使用的是.Net 5 WebApi项目,数据库使用的是SQL Server,主要会整理下常用的api,现在就开始吧~ 初始化 先选择一个WebCoreApi项目进行创建,创建完项 ...
- [BZOJ3451] Normal 题解
这题分三步:葺网(期望).淀粉质(点分治).蓉翅(容斥),再佐以芬芳团(FFT),一道巨难无比的 luogu 黑题就诞生了. 期望 先考虑在淀粉树上,\(i\) 点在 \(j\) 点的子树里的概率.实 ...