Maven Docker鏡像使用技巧


摘要: Maven是目前最流行的Java項目管理工具之一,提供了強大的包依賴管理和應用構建功能。本文以Maven為例介紹了Docker在應用構建中的一些常見技巧。

14808592379396

Maven是目前最流行的Java項目管理工具之一,提供了強大的包依賴管理和應用構建功能。

Docker提供了官方的Maven鏡像可以用於管理和構建Java應用。與直接安裝使用Maven工具相比,使用Docker鏡像具有更好的可移植性,可以方便地進行版本切換,非常適合在持續集成過程中使用。

關於Maven官方鏡像的用法可以參考使用文檔

使用阿里雲加速

Maven官方倉庫在國內網絡下的下載速度實在是讓人欲哭無淚,利用阿里雲的Maven鏡像可以大大提升軟件包下載速度。

我們可以在官方Maven鏡像的基礎之上添加阿里雲鏡像配置。其代碼可以在https://github.com/AliyunContainerService/maven-image 上獲得

它的配置文件settings.xml如下

<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命令一樣,直接在當前目錄中執行如下命令來構建應用

docker run -it --rm --name maven -v "$(pwd)":/usr/src/app -w /usr/src/app registry.cn-hangzhou.aliyuncs.com/acs/maven mvn clean install 

如果希望能夠緩存下載的maven倉庫,我們可以利用Docker的文件卷來實現

首先執行如下命令創建一個名為“maven-repo”的文件卷

docker volume create --name maven-repo 

在之后的調用中,將其掛載到maven鏡像中倉庫下載目錄上

docker run -it --rm --name maven -v "$(pwd)":/usr/src/app -v maven-repo:/usr/share/maven/ref -w /usr/src/app registry.cn-hangzhou.aliyuncs.com/acs/maven mvn clean install 

這樣maven倉庫就不會每次都下載一遍了。

優化Dockerfile提升構建速度

我們可以在Dockerfile中構建應用,並利用Docker構建時的分層緩存機制來提升構建速度

下面是一個示例Dockerfile.build文件

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包,可以大大加快鏡像構建速度。

我們可以通過如下命令來編譯應用

docker build -t builder-img -f Dockerfile.build . 

應用編譯與Docker鏡像構建分離

對於靜態編譯型語言,我們通常需要將應用編譯過程與鏡像構建過程分離。主要有以下兩個考慮:

  • 最終生成的Docker鏡像不應該包含源代碼
  • 最終生成的Docker鏡像應該最小化,不應該包含編譯時工具

我們可以將應用編譯結果從Docker鏡像中拷貝出來,方法如下

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鏡像構建分離


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM