作者:林子冰2011 | 来源:互联网 | 2023-02-12 06:35
我正在尝试使用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构建过程中的任何内容都会成为生成的图像的一部分.
1> Kim..:
通常,pom.xml
文件没有变化,但是当您尝试启动docker映像构建时,其他src代码会发生变化.在这种情况下,你可以这样做:
供参考:
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依赖项.
然后添加所有源文件,并开始编译(mvn package
).
当您的更改pom.xml
或您第一次运行此脚本时,docker将执行1 - > 2 - > 3.当pom.xml
文件中没有更改时,docker将跳过步骤1,2并直接执行3.
这个简单的技巧可以用在许多其他包管理环境中.
尼斯,写了一篇关于这种方法以及使用壁球的文章,以减小最终图像的大小:https://medium.com/pismolabs/reducing-image-sizes-and-caching-maven-dependencies-in-docker-builds- b388d3f7aa88
2> Daniel Watro..:
事实证明,我用作基础的图像具有定义的父图像
VOLUME "$USER_HOME_DIR/.m2"
请参阅:https://github.com/carlossg/docker-maven/blob/322d0dff5d0531ccaf47bf49338cb3e294fd66c8/jdk-8/Dockerfile
结果是在构建期间,所有文件都被写入$USER_HOME_DIR/.m2
,但由于它应该是卷,因此这些文件都不会与容器映像一起保留.
目前在Docker中没有任何方法可以取消注册该卷定义,因此有必要构建一个单独的maven图像,而不是使用官方的maven图像.
我使用Docker卷并告诉maven为我的maven存储库缓存使用不同的路径,例如`-Dmaven.repo.local =/mvn/.m2nrepo/repository`