本文介紹了maven docker鏡像使用技巧,分享給大家,具體如下:
maven是目前最流行的java項目管理工具之一,提供了強大的包依賴管理和應用構建功能。
docker提供了官方的maven鏡像可以用于管理和構建java應用。與直接安裝使用maven工具相比,使用docker鏡像具有更好的可移植性,可以方便地進行版本切換,非常適合在持續集成過程中使用。
關于maven官方鏡像的用法可以參考使用文檔
使用阿里云加速
maven官方倉庫在國內網絡下的下載速度實在是讓人欲哭無淚,利用阿里云的maven鏡像可以大大提升軟件包下載速度。
我們可以在官方maven鏡像的基礎之上添加阿里云鏡像配置。其代碼可以在https://github.com/aliyuncontainerservice/maven-image 上獲得
它的配置文件settings.xml如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<settings xmlns= "http://maven.apache.org/settings/1.0.0" xmlns:xsi= "http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http: //maven.apache.org/settings/1.0.0 https: //maven.apache.org/xsd/settings-1.0.0.xsd"> <localrepository>/usr/share/maven/ref/repository</localrepository> <mirrors> <mirror> <!-- this sends everything else to / public --> <id>aliyun-nexus</id> <mirrorof>*</mirrorof> <url>http: //maven.aliyun.com/nexus/content/groups/public/</url> </mirror> <mirror> <!-- this is used to direct the public snapshots repo in the profile below over to a different nexus group --> <id>aliyun-nexus- public -snapshots</id> <mirrorof> public -snapshots</mirrorof> <url>http: //maven.aliyun.com/nexus/content/repositories/snapshots/</url> </mirror> </mirrors> </settings> |
阿里云容器服務提供了預構建的docker鏡像可供直接使用registry.cn-hangzhou.aliyuncs.com/acs/maven,
我們可以像使用mvn命令一樣,直接在當前目錄中執行如下命令來構建應用
如果希望能夠緩存下載的maven倉庫,我們可以利用docker的文件卷來實現
首先執行如下命令創建一個名為“maven-repo”的文件卷
1
|
docker volume create --name maven-repo |
在之后的調用中,將其掛載到maven鏡像中倉庫下載目錄上
這樣maven倉庫就不會每次都下載一遍了。
優化dockerfile提升構建速度
我們可以在dockerfile中構建應用,并利用docker構建時的分層緩存機制來提升構建速度
下面是一個示例dockerfile.build文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
from registry.cn-hangzhou.aliyuncs.com/acs/maven: 3 -jdk- 8 env my_home=/usr/src/app run mkdir -p $my_home workdir $my_home add pom.xml $my_home # get all the downloads out of the way run [ "/usr/local/bin/mvn-entrypoint.sh" , "mvn" , "verify" , "clean" , "--fail-never" ] # add source add . $my_home # run maven verify run [ "/usr/local/bin/mvn-entrypoint.sh" , "mvn" , "verify" ] |
其中的一個重要技巧就是先把pom.xml添加到工作目錄,利用maven命令下載應用所需jar包之后,再添加應用源文件進行編譯。這樣只要pom.xml沒有更新就不會重新下載所依賴的jar包,可以大大加快鏡像構建速度。
我們可以通過如下命令來編譯應用
1
|
docker build -t builder-img -f dockerfile.build . |
應用編譯與docker鏡像構建分離
對于靜態編譯型語言,我們通常需要將應用編譯過程與鏡像構建過程分離。主要有以下兩個考慮:
-
最終生成的docker鏡像不應該包含源代碼
-
最終生成的docker鏡像應該最小化,不應該包含編譯時工具
我們可以將應用編譯結果從docker鏡像中拷貝出來,方法如下
1
2
3
|
docker build -t builder-img -f dockerfile.build . docker create --name builder builder-img docker cp builder:/usr/src/app/target ./target |
這時maven構建的結果就被拷貝到當前目錄的“target”子目錄下面了。
之后,我們可以利用另外一個dockerfile來構建應用鏡像了。篇幅有限不再贅述。
總結
本文以maven為例介紹了docker在應用構建中的一些常見技巧
-
利用國內的鏡像站點加速軟件包下載:阿里云和阿里集團提供了大量開源項目的包管理鏡像站點,阿里云容器服務開源項目 https://github.com/aliyuncontainerservice 中提供很多帶加速能力的ruby/python/node/maven基礎鏡像可供參考。
-
在docker鏡像構建過程中,為了防止由于代碼變化反復下載軟件包,可以先把應用配置文件加入dockerfile,在編譯之前提前下載軟件包。比如ruby的gemfile, python的requirements.txt,和nodejs的package.json都可以采用類似方法。這樣可以更好地利用docker的分層緩存機制加速鏡像構建過程。
-
應用編譯應該與docker鏡像構建分離
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/ilinuxer/p/6649029.html