本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>
提问: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编译时,将经历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
复制代码
我的理解是,在docker构建过程中RUN所做的任何事情都会成为结果映像的一部分。
回答1:
通常,pom.xml当您尝试启动Docker映像构建时,文件没有任何变化,只有其他一些源代码发生了变化。在这种情况下,您可以执行以下操作:
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。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END