欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker build时缓存maven依赖

程序员文章站 2024-03-12 22:12:14
...

现阶段所有的项目,都采用docker进行编译打包了,这样可以不用在CI/CD服务器上安装一堆的环境,也能够保证test,staging,production等环境的打包结果保持完全一致。

在用maven给java项目打包过程中,最初是用maven镜像进行编译,然后再把编译产出物复制出来,进行第二步的docker镜像打包,这样比较麻烦,而且有时会有问题,例如第一步编译失败,产生的临时文件owner 还是root,重新编译时候,CI/CD服务都没法删除这些临时文件,直接编译失败.

直到发现还有multi-stage build,一下子解决了这些问题. 在一个Dockerfile中,可以分为多个stage,后面的stage可以从前面的stage中直接复制产出物. 运用在maven打包的场景时,发现了一个问题,maven的依赖每次都要重新下载,在网上查到了一篇文章,测试后发现有效。

原理是使用dependency:go-offline,结合docker的cache机制

FROM maven:3.6-jdk-8 AS build
COPY pom.xml /usr/src/app/pom.xml
WORKDIR /usr/src/app
RUN mvn dependency:go-offline
COPY src /usr/src/app/src
RUN mvn -f /usr/src/app/pom.xml clean package -DskipTests


FROM openjdk:8-jre-slim
ENV JAR emi-server-0.0.1-SNAPSHOT.jar
EXPOSE 8080
COPY --from=build /usr/src/app/target/*.jar /app/
WORKDIR /app
CMD java -jar /app/$JAR


参考
Caching Maven dependencies in a Docker build