maven Docker多阶段构建和安装/共享前一阶段

sdnqo3pr  于 2023-01-29  发布在  Maven
关注(0)|答案(3)|浏览(204)

我希望使用多阶段构建,以避免每次构建应用程序时下载Java项目所需的所有Maven依赖项。
我正在考虑在第一阶段解决Maven依赖项,然后在第二阶段构建应用程序,这将需要访问在前一阶段下载的依赖项。
如果我很好地理解了多阶段构建,我可以将第一阶段创建的文件复制到第二阶段,但理想情况下,我希望能够"挂载"或"共享"依赖项所在的第一阶段的文件夹,而不是复制文件,这可能吗?或者有更好的方法来实现这一点?
谢谢。
编辑:
这是我考虑的第一阶段

FROM some-image-with-maven AS maven-repo
WORKDIR /workspace/
COPY pom.xml .
RUN mvn -B -f pom.xml dependency:resolve

但是由于pom文件在大多数情况下都是不同的(因为我想在项目之间共享这个阶段),接下来解决依赖关系的步骤将再次下载所有这些文件(而不是使用缓存层)。

8oomwypt

8oomwypt1#

如果不使用卷,您只能从第一阶段复制内容。使用卷时,您可以在基本上是独立容器示例的阶段之间共享数据。由于缺少清理卷通常无法正确处理,因此我建议保留复制策略。使用绑定装载与复制方法相比,共享数据没有真实的的好处。

vjhs03f7

vjhs03f72#

我不相信目前有这样的方法,要从一个构建阶段共享到下一个,唯一的选择是将COPY文件从一个阶段的目录共享到当前阶段。
为了将第一阶段用作构建缓存并避免复制所有依赖项,我将在第一阶段运行构建。或者,如果您希望在阶段之间进行额外的分离,您可以创建第二个中间阶段FROM stage1name。然后,构建的输出可以复制到最后一层,从而避免复制所有构建依赖项。

dvtswwa3

dvtswwa33#

来自"未来“的回答...
如果使用buildkit或兼容的(大多数人现在可能都是这样),你可以使用bind挂载来挂载前一个stage,这样就可以完成最初的帖子所要求的:

FROM someimage as build
COPY pom.xml .
RUN mvn -Dmaven.repo.local=/.m2_repository -B -f pom.xml dependency:resolve

FROM runtimeimage
COPY pom.xml .
COPY src/ ./src/
RUN --mount=type=bind,from=build,source=/.m2_repository,target=/.m2_repository \
    mvn package

但更重要的是,您也可以使用cache装载,这将导致在第一次运行时下载所有dep的成本,但随后将能够该高速缓存中找到这些dep:

FROM runtimeimage
COPY pom.xml .
COPY src/ ./src/
RUN --mount=type=cache,target=/.m2_repository,sharing=locked \
    mvn package

相关问题