問題描述
我正在嘗試使用 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緩存依賴的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!