我希望使用多阶段构建,以避免每次构建应用程序时下载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文件在大多数情况下都是不同的(因为我想在项目之间共享这个阶段),接下来解决依赖关系的步骤将再次下载所有这些文件(而不是使用缓存层)。
3条答案
按热度按时间8oomwypt1#
如果不使用卷,您只能从第一阶段复制内容。使用卷时,您可以在基本上是独立容器示例的阶段之间共享数据。由于缺少清理卷通常无法正确处理,因此我建议保留复制策略。使用绑定装载与复制方法相比,共享数据没有真实的的好处。
vjhs03f72#
我不相信目前有这样的方法,要从一个构建阶段共享到下一个,唯一的选择是将
COPY
文件从一个阶段的目录共享到当前阶段。为了将第一阶段用作构建缓存并避免复制所有依赖项,我将在第一阶段运行构建。或者,如果您希望在阶段之间进行额外的分离,您可以创建第二个中间阶段
FROM stage1name
。然后,构建的输出可以复制到最后一层,从而避免复制所有构建依赖项。dvtswwa33#
来自"未来“的回答...
如果使用
buildkit
或兼容的(大多数人现在可能都是这样),你可以使用bind
挂载来挂载前一个stage,这样就可以完成最初的帖子所要求的:但更重要的是,您也可以使用
cache
装载,这将导致在第一次运行时下载所有dep的成本,但随后将能够该高速缓存中找到这些dep: