如何重用早期多阶段构建中的 Docker 镜像?

问题描述 投票:0回答:1

这是我的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 dockerfile docker-multi-stage-build
1个回答
0
投票

为了使 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"]

© www.soinside.com 2019 - 2024. All rights reserved.