如何复用多阶段构建中已有的Docker镜像以加速构建?
优化Dockerfile以复用Maven依赖缓存
直接修改Dockerfile,利用Docker分层缓存特性拆分步骤,就能避免每次构建重复下载依赖:
ARG BUILD_PATH=/usr/app # Building image FROM maven:3.8.3-openjdk-17 AS maven ARG BUILD_PATH RUN mkdir -p $BUILD_PATH WORKDIR $BUILD_PATH # 先复制pom.xml,单独完成依赖下载 COPY pom.xml . RUN mvn dependency:go-offline -Dmaven.test.skip # 再复制项目全部代码 COPY . . # 基于已缓存的依赖执行打包 RUN mvn clean package -Dmaven.test.skip # Final image FROM eclipse-temurin:17-jdk-alpine ARG BUILD_PATH COPY --from=maven $BUILD_PATH/target/app.jar / ENTRYPOINT ["java", "-jar", "/app.jar"]
核心逻辑:
- Docker构建是分层执行的,只要某一层的输入内容没变化,就会复用之前的缓存层。
- 把
pom.xml单独复制并执行依赖下载,只要依赖配置不修改,这一层的缓存就会保留,不会重复下载依赖。 - 后续复制代码、打包的步骤,只会在代码变更时重新执行,不会触发依赖的重复下载。
额外提示:
- 多模块项目可以单独复制父pom和子模块pom文件,进一步细化缓存粒度。
- 构建时不要加
--no-cache参数,除非你需要完全重新构建所有层。
内容的提问来源于stack exchange,提问作者Rafael Santiago Altoé
相关产品推荐
相关产品推荐

