我正在尝试使用 docker 来自动化 Maven 构建。我要构建的项目需要将近20分钟才能下载所有依赖项,因此我尝试构建一个docker镜像来缓存这些依赖项,但似乎并没有保存它。我的 Dockerfile 是
FROM maven:alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ADD pom.xml /usr/src/app
RUN mvn dependency:go-offline
图像构建,它确实下载了所有内容。但是,生成的图像与基础图像大小相同 maven:alpine
图像,因此它似乎没有缓存图像中的依赖项。当我尝试将图像用于 mvn compile
它经历了整整 20 分钟的重新下载所有内容。
是否可以构建一个缓存我的依赖项的 Maven 图像,这样它们就不必在我每次使用该图像执行构建时都下载?
我正在运行以下命令:
docker build -t my-maven .
docker run -it --rm --name my-maven-project -v "$PWD":/usr/src/mymaven -w /usr/src/mymaven my-maven mvn compile
我的理解是,无论 RUN
在 docker 构建过程中做什么,都会成为结果图像的一部分。
原文由 Daniel Watrous 发布,翻译遵循 CC BY-SA 4.0 许可协议
通常,
pom.xml
文件没有变化,但当您尝试启动 docker image build 时,只有一些其他源代码发生变化。在这种情况下你可以这样做:供参考:
所以关键是:
添加
pom.xml
文件。然后
mvn verify --fail-never
它,它将下载maven依赖项。然后添加所有源文件,然后开始编译(
mvn package
)。当您的
pom.xml
文件发生变化或者您是第一次运行此脚本时,docker 将执行 1 -> 2 -> 3。当pom.xml
文件没有变化时,docker会跳过步骤1、2,直接做3。这个简单的技巧可以用于许多其他包管理环境(gradle、yarn、npm、pip)。
编辑:
您还应该考虑使用
mvn dependency:resolve
或mvn dependency:go-offline
根据其他评论和答案的建议。