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的配置。
    • 对于testprod的指定通过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打包方式修改

    • pombuild下面将打包方式修改为如下

      <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每个项目对应的主类不一样,需要进行修改。

    • dockerfile命令详解

  • 在打包的pom文件同级目录下创建Jenkinsfile

    • Jenkinsfile内容

      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 '正式服更新完成!'
                  }
              }
          }
      }
    • 说明

      1. 这个文件对每次版本的变动都需要修改ImageTag为对应的版本。
      2. 注意:这个文件里面不能写注释。
      3. 对于在项目的module下打包的情况,需要把 stage('Build') 下面的steps里面的 sh 'mvn -B -DskipTests clean package dockerfile:build -f pom.xml'改为对应的module下面。
      4. Jenkinspipline语法有Scripted PipelineDeclarative Pipeline两种,这里使用的是声明式piplinepipline语法详情
  • gitlab项目设置

    • 添加为可访问gitlab仓库的账号信息。
    • 通过setting -> members -> add member的方式添加。
  • Jenkins配置

    • jenkins访问地址:http://192.168.1.100:8080,账号密码:admin/123456
    • jenkins pipline创建流程: new任务 -> enter an item name -> 流水线 -> okpipline -> definition -> pipline script from SCM -> SCM -> git -> Repository url -> credentials -> jenkins-gitlab-private -> 输入分支,默认master分支 -> save
    • 如果Jenkinsfilemodule下面,请在Script Path指定对应的path
  • 远端服务器脚本

    • 因为镜像的pullrun都是通过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,必须保持一致才能有效,版本的迭代每次需要改动两个地方,有点麻烦。
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实现自动化构建镜像说明的更多相关文章

  1. 使用Docker搭建Jenkins+Docker持续集成环境(自动化构建发布部署)

    本文介绍如何通过Jenkins的docker镜像从零开始构建一个基于docker镜像的持续集成环境,包含自动化构建.发布到仓库\并部署上线. 0. 前置条件 服务器安装docker,并启动docker ...

  2. Docker build Dockerfile 构建镜像 - 二

    Dockerfile 制作镜像 https://hub.docker.com/ 搜索需要镜像: https://hub.docker.com/_/centos/ 官方示例: centos:6 1.这里 ...

  3. Docker的自动构建镜像

    Dockerfile自动构建docker镜像类似ansible剧本,大小几kb手动做镜像:大小几百M+ dockerfile 支持自定义容器的初始命令 dockerfile主要组成部分: 基础镜像信息 ...

  4. Docker镜像构建原理解析(不装docker也能构建镜像)

    在devops流程里面 构建镜像是一个非常重要的过程,一般构建镜像是写dockerfile文件然后通过docker client来构建的image. docker client 会先检查本地有没有im ...

  5. Docker学习(7) 构建镜像

    构建docker镜像 1 构建镜像的两种方式 1 通过容器构建镜像 2 通过Dockerfile构建镜像

  6. 在Centos7下docker配置自动化环境镜像(python3.7+selenium 3.11+firefox 62+geckodriver 0.21)

    最近在学习Docker,准备做自动化测试代码集成的功能.如下文章的前提是已经安装好linux系统,且成功安装好Docker. 接下来我会按步骤一步一步的对自动化需要的一些环境进行安装,如果没有特别说明 ...

  7. docker commit理解构建镜像(7)

    镜像是多层存储,每一层是在前一层的基础上进行的修改: 而容器同样也是多层存储是在以镜像为基础层,在基础层上加一层作为容器运行时的存储层. 当我们使用Docker Hub的镜像无法满足我们的需求时,我们 ...

  8. 【云原生 · Kubernetes】Jenkins+Gitlab+Rancher+Docker 实现自动构建镜像的 CI 平台(一)

    1 准备 Jenkins+Gitlab 实验环境 1.1 准备实验环境:恢复到以一下快照:该环境已经配置好 jenkins+gitlab+sonar-配置通 主机角色: IP 地址 运行的服务 硬件配 ...

  9. 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安装有两种方法:一 ...

  10. springboot docker jenkins 自动化部署并上传镜像

    springboot + docker + jenkins自动化部署项目,jenkins.mysql.redis都是docker运行的,并且没有使用虚拟机,就在阿里云服务器(centos7)运行 1. ...

随机推荐

  1. w3cschool-Apache Pig 教程

    https://www.w3cschool.cn/apache_pig/ 什么是Apache Pig? Apache Pig是MapReduce的一个抽象.它是一个工具/平台,用于分析较大的数据集,并 ...

  2. 如何在 ASP.NET Core 中实现速率限制?

    在 ASP.NET Core 中实现速率限制(Rate Limiting)中间件可以帮助你控制客户端对 API 的请求频率,防止滥用和过载.速率限制通常用于保护服务器资源,确保服务的稳定性和可用性. ...

  3. Maven配置代理

    Maven配置代理 找到settings.xml文件: 通常位于Maven安装目录下的conf文件夹中.或者位于用户目录下的.m2文件夹中(例如:$HOME/.m2/settings.xml). 编辑 ...

  4. 埋点-App层丢失率

    一.建表语句 create table dws_bhv_habo_measure_lostrate_mb_di( version_flag bigint comment '版本标签 2:web丢失 3 ...

  5. Leetcode 765 情侣牵手 / Hetao-013 翅膀打结 题解 [ 黄 ] [ 并查集 ] [ BFS ] [ 贪心 ]

    经典的连通块题,幸好我之前在 leetcode 看过原. 转化 首先观察到一对cp无论是男在前,还是女在前,都视为配对成功,对答案无影响. 因此,我们可以把一对情侣赋同一个编号,直接加一除以二即可. ...

  6. 使用 Git 命令和 Github 前须了解的知识

    本文不包括 Git 命令的介绍与使用,只分享 Git 的关键概念与 Github 项目的基本工作流程.作者相信先了解它们对后续的学习和工作大有裨益.(如有错误和建议请大家评论告知) 版本控制系统 VC ...

  7. 为DeepSeek添加本地知识库

    为什么要尝试给DeepSeek添加本地知识库呢?作为一个程序员,以前也用过很多AI产品,直到春节DeepSeek爆火,成功在自己的电脑上把AI模型跑起来的时候才真正感受到AI已近在咫尺.未来很多应用和 ...

  8. 自适应 Simpson 积分法学习笔记

    自适应 Simpson 积分法,是一种计算一段区间内,形态奇怪的函数和的算法,例如面积并和难以直接用通项公式计算的函数. Simpson 积分 我们都知道,求解微积分需要求解一个导数的原函数,但这显然 ...

  9. [SHOI2017] 摧毁“树状图”

    首先只要得到 \(x=0\) 时的答案,就可以 \(AC\) 本题.这是很重要的. 考虑由于不能有重复经过的边,所以两路径交点数量 \(\le 1\). 容易想到设 \(dp_u\) 表示以 \(u\ ...

  10. Kafka - server.properties参数详解

    server.properties #broker的全局唯一编号,不能重复 broker.id=0 #用来监听链接的端口(kafka端口号),producer或consumer将在此端口建立连接 po ...