问题描述
我正在尝试使用 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"]
所以关键是:
添加
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:resolve
或 mvn dependency:go-offline
相应地作为其他注释 &答案建议.
You should also consider using mvn dependency:resolve
or mvn dependency:go-offline
accordingly as other comments & answers suggest.
这篇关于Maven docker缓存依赖的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!