# spring-boot-docker **Repository Path**: alexanderwei/spring-boot-docker ## Basic Information - **Project Name**: spring-boot-docker - **Description**: springboot构建docker镜像方法 以及spring-boot-native构建方式 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-06-03 - **Last Updated**: 2024-06-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [toc] # spring-boot 容器化构建 环境参数 - 操作系统:WSL 2: Ubuntu 22.04.4 LTS jammy - graal版本: Oracle GraalVM 21.0.3+7.1 (build 21.0.3+7-LTS-jvmci-23.1-b37) - docker版本:Docker version 26.1.1, build 4cf5afa docker镜像构建的三种方式 - spring-boot-maven-plugin - jib-maven-plugin - docker-maven-plugin ## spring-boot-maven-plugin ### 重要配置 pom插件配置如下: ```xml org.springframework.boot spring-boot-maven-plugin 3.2.6 ${project.artifactId}:latest ${maven.build.timestamp} ``` ### 优缺点 优点:几乎不用配置,全部由插件完成,只需要指定构建参数即可。然后执行命令 ```./mvnw clean spring-boot:build-image```,直到构建完成。详细可以参考官方文档[Packaging OCI Images :: Spring Boot](https://docs.spring.io/spring-boot/maven-plugin/build-image.html)。可以查看该镜像的结构,学习该结构,用于优化自己的构建。 缺点:依赖网络环境,需要连接github。因为配置文件可以指定builder,理论上可以基于默认的builder(paketobuildpakcs)来制作buidler解决网络依赖问题。但是专门为该插件定制镜像,复杂程度比直接用Dockerfile高多了,插件自身的可配置性也不够,还不如直接通过Dockerfile来构建。 ## jib-maven-plugin ### 重要配置 ```xml com.google.cloud.tools jib-maven-plugin 3.4.2 eclipse-temurin:21-jre-alpine ${project.artifactId}:latest com.alex.springbootbuilddocker.SpringBootBuildDockerApplication USE_CURRENT_TIMESTAMP package dockerBuild ``` 这里只配置了基础镜像、构建名称和构建时间。其余配置可以参考[jib/jib-maven-plugin at master · GoogleContainerTools/jib (github.com)](https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin)。该插件还可以配置registry mirrors,配置文件的位置在```${HOME}/.config/google-cloud-tools-java/jib```下,不操作系统参考配置文档。 执行```./mvnw clean package```即可完成构建,然后通过docker-compose启动容器。 ### 优缺点 优点:该插件为java项目通用插件、配置简单、可配置性较强,不依赖本地docker环境(goal改为build),且构建方式也为分层构建,可以构建tar包,还可以构建后推送到远程镜像仓库(goal改为build),且不需要spring-boot-maven-plugin插件 缺点:完全用插件配置,有一定学习成本。虽然插件本身的可配置性很强,但是还是不如Dockerfile灵活 ## docker-maven-plugin ### 重要配置 pom插件配置如下: ```xml org.springframework.boot spring-boot-maven-plugin 3.2.6 com.alex.springbootbuilddocker.SpringBootBuildDockerApplication repackage org.codehaus.mojo exec-maven-plugin 3.3.0 package exec bash -c io.fabric8 docker-maven-plugin 0.44.0 package build ${project.artifactId}:latest ${project.basedir}/Dockerfile ${project.basedir} ``` Dockerfile配置如下: ```Dockerfile FROM eclipse-temurin:21-jre-alpine WORKDIR /app ARG EXTRACTED=target/extracted COPY ${EXTRACTED}/dependencies/ ./ COPY ${EXTRACTED}/snapshot-dependencies/ ./ COPY ${EXTRACTED}/spring-boot-loader/ ./ COPY ${EXTRACTED}/application/ ./ ENV TZ="Asia/Shanghai" RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ENTRYPOINT ["sh","-c","java org.springframework.boot.loader.launch.JarLauncher"] ``` 该配置主要分为以下三点: 1. spring-boot-maven-plugin,用于构建jar包,2.3后分层特性是默认开启的。参考官方文档:[spring-boot-docker](https://spring.io/guides/topicals/spring-boot-docker),[Maven Plugin :: Spring Boot](https://docs.spring.io/spring-boot/maven-plugin/index.html) 2. exec-maven-plugin,用来执行命令或脚本,用于将打好的jar包,拆成四个分层的文件夹 3. docker-maven-plugin,用来构建镜像,该插件可以统一镜像名、镜像版本与pom文件一致 上面的配置同下面的脚本功能一致,脚本的优点是简单易懂,缺点是硬编码较多 ```shell ./mvnw clean package -DskipTests mkdir target/extracted java -Djarmode=layertools -jar target/*.jar extract --destination target/extracted docker build . -t spring-boot-build-docker:latest ``` ### 优缺点 该方式的优点是各步骤相互独立,且每一步都是简单容易理解的、扩展灵活,同时不依赖网络环境。 缺点是每一步都需要理解并自己配置。 该方式多用于实际生产中。 # spring boot native 镜像构建 环境参数 - 操作系统:WSL 2: Ubuntu 22.04.4 LTS jammy - graal版本: Oracle GraalVM 21.0.3+7.1 (build 21.0.3+7-LTS-jvmci-23.1-b37) - docker版本:Docker version 26.1.1, build 4cf5afa ## 重要配置 ```xml org.graalvm.buildtools native-maven-plugin org.springframework.boot spring-boot-maven-plugin ${project.artifactId}-native:latest ${maven.build.timestamp} ``` ### 构建本地可执行文件 ``` shell ./mvnw clean native:compile -Pnative ``` 该命令依赖gcc和zlib,需要先执行(不同环境需要的依赖不一样,可以先执行上面的编译命令,再根据报错添加所需依赖库) ```shell sudo apt-get install gcc sudo apt-get install zlib1g-dev ``` 构建成功后,启动应用,执行 ```shell ./target/spring-boot-build-docker ``` 启动速度极快,几十毫秒 该方式无需联网,可以构建后通过Dockerfile继续构建docker镜像,但是需要保持构建环境和运行环境的类库兼容性。可以考虑通过同一个基础镜像构建构建镜像和运行镜像。 ### 构建OCI镜像 ``` shell ./mvnw clean spring-boot:build-image -Pnative ``` 通过docker-compose.yaml启动容器,同样也是极快启动 该方式是通过paketobuildpacks在docker容器中编译和构建镜像,能保证编译环境与运行环境的一致性,屏蔽了不同操作系统版本的影响。该方式是比较适合方式。但是构建过程中有些依赖需要从github上下载,有网络联通问题,且插件参数不能配置镜像或离线构建。