这是我的dockerfile:
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
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 build -t name .
构建应用程序时,docker 都会再次构建 Maven 映像,这将下载所有项目的依赖项并打包应用程序,这需要一段时间。我想知道是否有一种方法可以让 docker 重用早期构建中的映像(已下载所有项目的依赖项)来打包将在最终构建中使用的 jar。
为了使 docker 重用早期构建中的映像(该映像将下载所有项目的依赖项),我建议您在复制应用程序源代码之前首先单独处理 Maven 依赖项。这将使用 Docker 的缓存机制来避免重新下载依赖项(如果它们没有更改)。
最初仅复制
pom.xml
,因为这允许 Docker 缓存具有下载的依赖项的层,只要依赖项不改变,这将加快后续构建的速度。
处理依赖关系后,复制项目的其余部分并构建。
你可以尝试像这样修改你的 Dockerfile:
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
# Only copy the Maven POM file and download dependencies
COPY pom.xml .
RUN mvn dependency:go-offline
# Now copy the rest of the source code and build the project
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"]