Maven docker缓存依赖

2022-01-14 00:00:00 docker dockerfile caching java maven

我正在尝试使用 docker 来自动化 maven 构建.我要构建的项目需要将近20分钟才能下载所有依赖项,所以我尝试构建一个可以缓存这些依赖项的docker镜像,但它似乎没有保存它.我的 Dockerfile 是

I'm trying to use docker to automate maven builds. The project I want to build takes nearly 20 minutes to download all the dependencies, so I tried to build a docker image that would cache these dependencies, but it doesn't seem to save it. My Dockerfile is

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 分钟的重新下载所有内容.

The image builds, and it does download everything. However, the resulting image is the same size as the base maven:alpine image, so it doesn't seem to have cached the dependencies in the image. When I try to use the image to mvn compile it goes through the full 20 minutes of redownloading everything.

是否可以构建一个缓存我的依赖项的 maven 映像,这样我每次使用该映像执行构建时就不必下载它们?

Is it possible to build a maven image that caches my dependencies so they don't have to download everytime I use the image to perform a build?

我正在运行以下命令:

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 构建过程中所做的任何事情都会成为结果图像的一部分.

My understanding is that whatever RUN does during the docker build process becomes part of the resulting image.

推荐答案

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

Usually, there's no change in pom.xml file but just some other source code changes when you're attempting to start docker image build. In such circumstance you can do this:

仅供参考:

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 文件.

然后mvn verify --fail-never,它会下载maven依赖.

then mvn verify --fail-never it, it will download maven dependencies.

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

add all your source file then, and start your compilation(mvn package).

当你的 pom.xml 文件有变化或者你是第一次运行这个脚本时,docker 会做 1 -> 2 -> 3.当没有变化时在pom.xml文件中,docker会跳过第1、2步,直接做第3步.

When there are changes in your pom.xml file or you are running this script for the first time, docker will do 1 -> 2 -> 3. When there are no changes in pom.xml file, docker will skip step 1、2 and do 3 directly.

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

This simple trick can be used in many other package management circumstances(gradle、yarn、npm、pip).

您还应该考虑使用 mvn dependency:resolvemvn dependency:go-offline 相应地作为其他注释 &答案建议.

You should also consider using mvn dependency:resolve or mvn dependency:go-offline accordingly as other comments & answers suggest.

相关文章