Maven docker 缓存依赖项

新手上路,请多包涵

我正在尝试使用 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 许可协议

阅读 844
1 个回答

通常, pom.xml 文件没有变化,但当您尝试启动 docker image build 时,只有一些其他源代码发生变化。在这种情况下你可以这样做:

供参考:

 FROM maven:3-jdk-8

ENV HOME=/home/usr/app

RUN mkdir -p $HOME

WORKDIR $HOME

# 1. add pom.xml only here

ADD pom.xml $HOME

# 2. start downloading dependencies

RUN ["/usr/local/bin/mvn-entrypoint.sh", "mvn", "verify", "clean", "--fail-never"]

# 3. add all source code and start compiling

ADD . $HOME

RUN ["mvn", "package"]

EXPOSE 8005

CMD ["java", "-jar", "./target/dist.jar"]

所以关键是:

  1. 添加 pom.xml 文件。

  2. 然后 mvn verify --fail-never 它,它将下载maven依赖项。

  3. 然后添加所有源文件,然后开始编译( mvn package )。

当您的 pom.xml 文件发生变化或者您是第一次运行此脚本时,docker 将执行 1 -> 2 -> 3。当 pom.xml 文件没有变化时,docker会跳过步骤1、2,直接做3。

这个简单的技巧可以用于许多其他包管理环境(gradle、yarn、npm、pip)。

编辑:

您还应该考虑使用 mvn dependency:resolvemvn dependency:go-offline 根据其他评论和答案的建议。

原文由 Kim 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏