Spring Boot的 Docker打包插件更实用的选择

Spring Boot Docker

在Spring Boot应用中,我们可以约定不同的标识来定义不同的环境。例如 dev 表示开发环境、test表示测试环境,对应的配置文件为application-dev.yaml、application-test.yaml。我们通过声明spring.profiles.active来激活对应的环境配置,例如激活dev环境时spring.profiles.active=dev。完整的启动命令为:


  1. java -Djava.security.egd=file:/dev/./urandom  -Dspring.profiles.active=dev -jar spring-boot-app.jar  

根据上面的命令编写一个能够适应多环境的Dockerfile:


  1. # 引入 openjdk 镜像 
  2. FROM adoptopenjdk/openjdk8 
  3. # 声明作者 
  4. LABEL AUTHOR=felord OG=felord.cn 
  5. # 挂载几个有用的文件夹 比如日志 
  6. VOLUME ["/tmp","/logs"
  7. # 声明一个环境参数用来动态启用配置文件 默认dev 
  8. ENV ACTIVE=dev 
  9. # 暴露端口 
  10. EXPOSE 8080 
  11. # 复制并修改应用打包后的jar文件名称 
  12. ADD /target/flyway-spring-boot-1.0.0.jar app.jar 
  13. # 容器启动时第一个运行的命令 用来启动应用 
  14. ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=${ACTIVE}","-jar","app.jar"

这样打包的Docker镜像就可以通过docker run添加额外的–env ACTIVE=test 来动态的改变环境。单纯的编写Dockerfile不方便我们DevOps。

docker 镜像生命周期

我们需要能够自动地构建、推送到仓库、拉取镜像、运行一系列流水线操作。好在市面上有很多工具来帮助我们实现这一过程。

spring-boot-maven-plugin

这个是Spring Boot官方的插件,在2.x的某个版本提供了Docker镜像构建能力。


  1. <project> 
  2.  <build> 
  3.   <plugins> 
  4.    <plugin> 
  5.     <groupId>org.springframework.boot</groupId> 
  6.     <artifactId>spring-boot-maven-plugin</artifactId> 
  7.     <configuration> 
  8.      <image> 
  9.      <name>docker.repo.com/library/${project.artifactId}:${project.version}</name
  10.       <publish>true</publish> 
  11.      </image> 
  12.      <docker> 
  13.       <publishRegistry> 
  14.        <username>user</username> 
  15.        <password>secret</password
  16.        <url>https://docker.repo.com/v1/</url> 
  17.        <email>user@example.com</email> 
  18.       </publishRegistry> 
  19.      </docker> 
  20.     </configuration> 
  21.    </plugin> 
  22.   </plugins> 
  23.  </build> 
  24. </project> 

配置好Docker私仓后就可以通过mvn clean spring-boot:build-image 进行构建镜像了。

这种方式好处就是无额外依赖,缺点就是需要从github下载构建元件,网络如果不好就容易失败。

Spotify Maven Plugin

Spotify Maven 插件是一个目前比较普遍的选择。它要求应用程序开发人员编写Dockerfile,并把Dockerfile放在项目src/main/docker目录下。然后你就可以通过引入:


  1. <plugin> 
  2.           <groupId>com.spotify</groupId> 
  3.           <artifactId>dockerfile-maven-plugin</artifactId> 
  4.           <version>1.4.8</version> 
  5.           <configuration> 
  6.               <repository>repo.com/${project.artifactId}</repository> 
  7.           </configuration> 
  8.       </plugin> 

这个插件提供了mvn dockerfile:build、mvn dockerfile:tag、mvn dockerfile:push三个命令分别用来构建、打标签、发布到远端私有仓库,非常简单。

这个是一个非常容易上手的插件,唯一的要求就是需要会编写Dockerfile,对定制化要求高的可以使用这个。

Jib Maven Plugin

这个曾经我在早些时候的一篇文章中已经介绍过了,可以详细了解一下。它是谷歌开源的OCI镜像打包工具,可以用来打包Docker镜像,大部分情况下已经满足需要。但是如果你要定制化的话还是不容易的,需要阅读官方给的文档。最开始的Dockerfile如果使用JIb的话需要这样配置:


  1. <plugin> 
  2.     <groupId>com.google.cloud.tools</groupId> 
  3.     <artifactId>jib-maven-plugin</artifactId> 
  4.     <version>3.0.0</version> 
  5.     <configuration> 
  6.         <from
  7.             <image>adoptopenjdk/openjdk8</image> 
  8.         </from
  9.         <to
  10.             <image>docker.repo.com/library/${project.artifactId}</image> 
  11.             <auth> 
  12.                 <username>felord</username> 
  13.                 <password>xxxxxx</password
  14.             </auth> 
  15.             <tags> 
  16.                 <tag>${project.version}</tag> 
  17.             </tags> 
  18.         </to
  19.         <extraDirectories> 
  20.             <paths> 
  21.                 <path> 
  22.                     <from>target/${project.artifactId}-${project.version}.jar</from
  23.                     <includes>*.jar</includes> 
  24.                     <into>/app.jar</into
  25.                 </path> 
  26.             </paths> 
  27.         </extraDirectories> 
  28.         <containerizingMode>packaged</containerizingMode> 
  29.         <container> 
  30.             <volumes>/tmp,/logs</volumes> 
  31.             <ports> 
  32.                 <port>8080</port> 
  33.             </ports> 
  34.             <environment> 
  35.                 <active>dev</active> 
  36.             </environment> 
  37.             <entrypoint> 
  38.                 java,-Djava.security.egd=file:/dev/./urandom,-Dspring.profiles.active=${active},-jar,/app.jar 
  39.             </entrypoint> 
  40.             <creationTime>USE_CURRENT_TIMESTAMP</creationTime> 
  41.         </container> 
  42.     </configuration> 
  43. </plugin> 

优点是不需要本地Docker环境,而且支持分层构建、镜像瘦身,上手容易;缺点是定制化比较困难。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章