【开发】springboot项目docker分层构建

一、需求场景

在使用dockerfile构建springboot项目时,速度较慢,用时比较长,为了加快构建docker镜像的速度,采用分层构建的方式

二、构建配置

1、pom.xml配置

	<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>

        <docker.plugin.version>0.43.4</docker.plugin.version>
        <docker.registry>reg.harborXXX.com</docker.registry>
        <docker.namespace>order</docker.namespace>
    </properties>

	<build>
        <finalName>order-xxx</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>${docker.plugin.version}</version>
                <configuration>
                    <registry>${docker.registry}</registry>
                    <images>
                        <image>
                        	<name>${docker.registry}/${docker.namespace}/${project.build.finalName}:${project.version}</name>
                            <build>
                                <dockerFileDir>${project.basedir}</dockerFileDir>
                            </build>
                        </image>
                    </images>
                </configuration>
            </plugin>
        </plugins>
    </build>

2、Dockerfile

reg.harborXXX.com为自建harbor私服地址

自建私服参考:Docker仓库管理镜像 – 公共仓库【Docker Hub】和私人仓库【Registry】和【harbor】

# 分层构建, 加速增量构建
# 需配置host:{IP} reg.harborXXX.com

FROM reg.harborXXX.com/library/openjdk:8-ub as builder

WORKDIR app
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
RUN java -Djarmode=layertools -jar app.jar extract && rm app.jar

FROM reg.harborXXX.com/library/openjdk:8-ub

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENV JAVA_OPTS=" -server -Xmx1024m -Xms256m -Xmn512m -Xss256k"

WORKDIR app

COPY --from=builder /app/dependencies/ ./
COPY --from=builder /app/spring-boot-loader/ ./
COPY --from=builder /app/snapshot-dependencies/ ./
COPY --from=builder /app/application/ ./

EXPOSE 9091

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS org.springframework.boot.loader.JarLauncher"]

这个Dockerfile使用了分层构建的方法来构建一个Spring Boot应用的Docker镜像,目的是加速增量构建过程。以下是Dockerfile的解释和一些可能的优化建议:

分层构建解释
基础镜像:这个Dockerfile定义了两个阶段的构建过程,都使用了相同的基础镜像reg.harborXXX.com/library/openjdk:8-ub。这个镜像基于OpenJDK 8

第一阶段:构建阶段 (as builder):在这个阶段,它首先设置工作目录为/app,然后复制Jar包到/app目录并重命名为app.jar。接着,它使用Spring Bootlayertools来提取Jar包中的层(layer),然后删除app.jar文件。

第二阶段:最终镜像:在这个阶段,它再次设置工作目录为/app,并从构建阶段复制不同的层到当前工作目录。通过这种方式,可以在代码或依赖变更时只重新构建变更的层,从而加速构建过程。

环境变量和时区设置:设置时区为Asia/Shanghai,并配置Java虚拟机选项JAVA_OPTS

端口和入口点:暴露9091端口,并设置容器启动时的入口点为运行Spring Boot应用的命令。

### 创建 Spring Boot 应用程序的 Docker 镜像 #### 使用 Maven 插件构建镜像 为了优化构建过程并减少最终镜像大小,推荐使用 `spring-boot-maven-plugin` 来分层构建 Docker 镜像。该插件允许开发者通过Maven生命周期来管理Docker镜像的创建和推送操作[^2]。 ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <image> <name>${project.artifactId}:${project.version}</name> <builder>paketobuildpacks/builder:tiny</builder> </image> </configuration> </plugin> </plugins> </build> ``` 上述配置指定了要使用的Builder以及目标镜像名称。执行命令 `mvn spring-boot:build-image` 即可完成整个构建流程。 #### 编写自定义 Dockerfile 文件 对于更复杂的场景,则可以通过编写Dockerfile来自定义构建逻辑。下面是一个典型的用于Spring Boot项目Dockerfile模板: ```dockerfile FROM eclipse-temurin:17-jre-alpine AS base WORKDIR /app COPY target/*.jar app.jar ENTRYPOINT ["java", "-jar", "/app/app.jar"] EXPOSE 8080 ``` 此文件首先选择了轻量级的基础Java运行时环境作为父镜像,并设置了工作目录与入口点脚本。最后暴露了默认的应用服务端口[^3]。 #### 利用 Jib 工具自动化容器化过程 除了传统的Docker CLI 和 Maven Plugin之外,还可以考虑采用 Google 开发的开源工具——Jib来进行无痛式的容器化转换。它可以直接读取项目结构而无需额外维护一份单独的Dockerfile描述文档[^4]。 ```xml <dependencyManagement> <dependencies> <dependency> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>3.3.0</version> </dependency> </dependencies> </dependencyManagement> <build> ... <plugins> <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <configuration> <from> <image>eclipse-temurin:17-jre-alpine</image> </from> <to> <image>${project.artifactId}:${project.version}</image> </to> </configuration> </plugin> </plugins> </build> ``` 只需简单修改POM中的依赖项声明部分即可启用Jib功能;之后同样借助于标准的Maven指令就能实现高效稳定的CI/CD流水线集成。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值