SpringBoot-SpringBoot的Docker打包插件-《Java笔记》

admin 2025-10-19 05:45:06 编程 来源:ZONE.CI 全球网 0 阅读模式

Java SpringBoot 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=fcant OG=fcant.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。2021-05-07-13-56-07-670767.pngdocker 镜像生命周期需要能够自动地构建、推送到仓库、拉取镜像、运行一系列流水线操作。好在市面上有很多工具来实现这一过程。

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>[email protected]</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:buildmvn dockerfile:tagmvn 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>fcant</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环境,而且支持分层构建、镜像瘦身,上手容易;缺点是定制化比较困难。

以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  6