Maven插件docker-maven-plugin的使用
1、docker-maven-plugin 介紹
在我們持續(xù)集成過(guò)程中,項(xiàng)目工程一般使用 Maven 編譯打包,然后生成鏡像,通過(guò)鏡像上線,能夠大大提供上線效率,同時(shí)能夠快速動(dòng)態(tài)擴(kuò)容,快速回滾,著實(shí)很方便。docker-maven-plugin 插件就是為了幫助我們?cè)贛aven工程中,通過(guò)簡(jiǎn)單的配置,自動(dòng)生成鏡像并推送到倉(cāng)庫(kù)中。
2、環(huán)境、軟件準(zhǔn)備
本次演示環(huán)境,我是在本機(jī) Mac OX 上操作,以下是安裝的軟件及版本:
- Docker:version 17.03.1-ce
- Maven:version 3.3.9
- Java: version 1.8.0_91
- docker-maven-plugin:1.0.0
注意:這里我們要測(cè)試 Java Maven 項(xiàng)目用 docker-maven 插件打鏡像,上傳鏡像等操作,所以需要先安裝一下 Docker、Maven、Java,這里忽略安裝過(guò)程。
3、Demo 示例
3.1 配置 DOCKER_HOST
docker-maven-plugin 插件默認(rèn)連接本地 Docker 地址為:localhost:2375,所以我們需要先設(shè)置下環(huán)境變量。
DOCKER_HOST=tcp://<host>:2375
注意:如果沒(méi)有設(shè)置 DOCKER_HOST 環(huán)境變量,可以命令行顯示指定 DOCKER_HOST 來(lái)執(zhí)行,如我本機(jī)指定 DOCKER_HOST:DOCKER_HOST=unix:///var/run/docker.sock mvn clean install docker:build。
3.2 示例構(gòu)建鏡像
構(gòu)建鏡像可以使用一下兩種方式,第一種是將構(gòu)建信息指定到 POM 中,第二種是使用已存在的 Dockerfile 構(gòu)建。
第一種方式,支持將 FROM, ENTRYPOINT, CMD, MAINTAINER 以及 ADD 信息配置在 POM 中,不需要使用 Dockerfile 配置。但是如果使用 VOLUME 或其他 Dockerfile 中的命令的時(shí)候,需要使用第二種方式,創(chuàng)建一個(gè) Dockerfile,并在 POM 中配置 dockerDirectory 來(lái)指定路徑即可。
這里我們以一個(gè) Java Maven 項(xiàng)目 mavendemo 作為示例演示一下。
3.2.1 指定構(gòu)建信息到 POM 中構(gòu)建
<build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>mavendemo</imageName> <baseImage>java</baseImage> <maintainer>docker_maven docker_maven@email.com</maintainer> <workdir>/ROOT</workdir> <cmd>["java", "-version"]</cmd> <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint> <!-- 這里是復(fù)制 jar 包到 docker 容器指定目錄配置 --> <resources> <resource> <targetPath>/ROOT</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build>
3.2.2 使用 Dockerfile 構(gòu)建
pom.xml配置
<build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>mavendemo</imageName> <dockerDirectory>${basedir}/docker</dockerDirectory> <!-- 指定 Dockerfile 路徑--> <!-- 這里是復(fù)制 jar 包到 docker 容器指定目錄配置,也可以寫(xiě)到 Docokerfile 中 --> <resources> <resource> <targetPath>/ROOT</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build>
${basedir}/docker/Dockerfile 配置
FROM java MAINTAINER docker_maven docker_maven@email.com WORKDIR /ROOT CMD ["java", "-version"] ENTRYPOINT ["java", "-jar", "${project.build.finalName}.jar"]
以上兩種方式執(zhí)行docker:build效果是一樣的,執(zhí)行輸出過(guò)程大致如下:
[INFO] --- docker-maven-plugin:1.0.0:build (default-cli) @ mavenDemo --- [INFO] Building image mavendemo Step 1/5 : FROM java ---> d23bdf5b1b1b Step 2/5 : MAINTAINER docker_maven docker_maven@email.com ---> Using cache ---> 2faf180d4a50 Step 3/5 : WORKDIR /ROOT ---> Using cache ---> 862210f7956a Step 4/5 : ENTRYPOINT java -jar mavenDemo.jar ---> Running in 96bbe83de6ec ---> c29009c88993 Removing intermediate container 96bbe83de6ec Step 5/5 : CMD java -version ---> Running in f69b8d2a75b1 ---> bc8d54014325 Removing intermediate container f69b8d2a75b1 Successfully built bc8d54014325
執(zhí)行完成后,使用docker images查看生成的鏡像:
REPOSITORY TAG IMAGE ID CREATED SIZE mavendemo latest 333b429536b2 38 minutes ago 643 MB
3.3 執(zhí)行命令
mvn clean package docker:build
只執(zhí)行 build 操作
mvn clean package docker:build -DpushImage
執(zhí)行 build 完成后 push 鏡像
mvn clean package docker:build -DpushImageTag 執(zhí)行 build 并 push 指定 tag 的鏡像
注意:這里必須指定至少一個(gè) imageTag,它可以配置到 POM 中,也可以在命令行指定。命令行指定如下:mvn clean package docker:build -DpushImageTags -DdockerImageTags=imageTag_1 -DdockerImageTags=imageTag_2
,POM 文件中指定配置如下:
<build> <plugins> ... <plugin> <configuration> ... <imageTags> <imageTag>imageTag_1</imageTag> <imageTag>imageTag_2</imageTag> </imageTags> </configuration> </plugin> ... </plugins> </build>
3.4 綁定Docker 命令到 Maven 各個(gè)階段
我們可以綁定 Docker 命令到 Maven 各個(gè)階段,我們可以把 Docker 分為 build、tag、push,然后分別綁定 Maven 的 package、deploy 階段,此時(shí),我們只需要執(zhí)行mvn deploy就可以完成整個(gè) build、tag、push操作了,當(dāng)我們執(zhí)行mvn build就只完成 build、tag 操作。除此此外,當(dāng)我們想跳過(guò)某些步驟或者只執(zhí)行某個(gè)步驟時(shí),不需要修改 POM 文件,只需要指定跳過(guò) docker 某個(gè)步驟即可。比如當(dāng)我們工程已經(jīng)配置好了自動(dòng)化模板了,但是這次我們只需要打鏡像到本地自測(cè),不想執(zhí)行 push 階段,那么此時(shí)執(zhí)行要指定參數(shù)-DskipDockerPush就可跳過(guò) push 操作了。
<build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>mavendemo</imageName> <baseImage>java</baseImage> <maintainer>docker_maven docker_maven@email.com</maintainer> <workdir>/ROOT</workdir> <cmd>["java", "-version"]</cmd> <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <targetPath>/ROOT</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> <execution> <id>tag-image</id> <phase>package</phase> <goals> <goal>tag</goal> </goals> <configuration> <image>mavendemo:latest</image> <newName>docker.io/wanyang3/mavendemo:${project.version}</newName> </configuration> </execution> <execution> <id>push-image</id> <phase>deploy</phase> <goals> <goal>push</goal> </goals> <configuration> <imageName>docker.io/wanyang3/mavendemo:${project.version}</imageName> </configuration> </execution> </executions> </plugin> </plugins> </build>
以上示例,當(dāng)我們執(zhí)行mvn package時(shí),執(zhí)行 build、tag 操作,當(dāng)執(zhí)行mvn deploy時(shí),執(zhí)行build、tag、push 操作。如果我們想跳過(guò) docker 某個(gè)過(guò)程時(shí),只需要:
- -DskipDockerBuild 跳過(guò) build 鏡像
- -DskipDockerTag 跳過(guò) tag 鏡像
- -DskipDockerPush 跳過(guò) push 鏡像
- -DskipDocker 跳過(guò)整個(gè)階段
例如:我們想執(zhí)行 package 時(shí),跳過(guò) tag 過(guò)程,那么就需要mvn package -DskipDockerTag。
3.5 使用私有 Docker 倉(cāng)庫(kù)地址
實(shí)際工作環(huán)境中,我們需要 push 鏡像到我們私有 Docker 倉(cāng)庫(kù)中,使用d ocker-maven-plugin 插件我們也是很容易實(shí)現(xiàn),有幾種方式實(shí)現(xiàn):
一、修改 POM 文件 imageName 操作
... <configuration> <imageName>registry.example.com/wanyang3/mavendemo:v1.0.0</imageName> ... </configuration> ...
二、修改 POM 文件中 newName 操作
... <configuration> <imageName>mavendemo</imageName> ... </configuration> <execution> <id>tag-image</id> <phase>package</phase> <goals> <goal>tag</goal> </goals> <configuration> <image>mavendemo</image> <newName>registry.example.com/wanyang3/mavendemo:v1.0.0</newName> </configuration> </execution> ...
3.6 安全認(rèn)證配置
當(dāng)我們 push 鏡像到 Docker 倉(cāng)庫(kù)中時(shí),不管是共有還是私有,經(jīng)常會(huì)需要安全認(rèn)證,登錄完成之后才可以進(jìn)行操作。當(dāng)然,我們可以通過(guò)命令行 docker login -u user_name -p password docker_registry_host 登錄,但是對(duì)于自動(dòng)化流程來(lái)說(shuō),就不是很方便了。使用 docker-maven-plugin 插件我們可以很容易實(shí)現(xiàn)安全認(rèn)證。
首先在 Maven 的配置文件 setting.xml 中增加相關(guān) server 配置,主要配置 Docker registry用戶認(rèn)證信息。
<servers> <server> <id>my-docker-registry</id> <username>wanyang3</username> <password>12345678</password> <configuration> <email>wanyang3@mail.com</email> </configuration> </server> </servers>
然后只需要在 pom.xml 中使用 server id 即可。
<plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>registry.example.com/wanyang3/mavendemo:v1.0.0</imageName> ... <serverId>my-docker-registry</serverId> </configuration> </plugin> </plugins>
3.7 其他參數(shù)
docker-maven-plugin 插件還提供了很多很實(shí)用的配置,稍微列舉幾個(gè)參數(shù)吧。
參數(shù) | 說(shuō)明 | 默認(rèn)值 |
---|---|---|
<forceTags>true</forceTags> |
build 時(shí)強(qiáng)制覆蓋 tag,配合 imageTags 使用 | false |
<noCache>true</noCache> |
build 時(shí),指定 –no-cache 不使用緩存 | false |
<pullOnBuild>true</pullOnBuild> |
build 時(shí),指定 –pull=true 每次都重新拉取基礎(chǔ)鏡像 | false |
<pushImage>true</pushImage> |
build 完成后 push 鏡像 | false |
<pushImageTag>true</pushImageTag> |
build 完成后,push 指定 tag 的鏡像,配合 imageTags 使用 | false |
<retryPushCount>5</retryPushCount> |
push 鏡像失敗,重試次數(shù) | 5 |
<retryPushTimeout>10</retryPushTimeout> |
push 鏡像失敗,重試時(shí)間 | 10s |
<rm>true</rm> |
build 時(shí),指定 –rm=true 即 build 完成后刪除中間容器 | false |
<useGitCommitId>true</useGitCommitId> |
build 時(shí),使用最近的 git commit id 前7位作為tag,例如:image:b50b604,前提是不配置 newName | false |
4、FAQ
1、執(zhí)行 build images 時(shí),報(bào)錯(cuò)情況一:
[INFO] Building image mavendemo
org.apache.http.impl.execchain.RetryExec execute
I/O exception (java.io.IOException) caught when processing request to {}->unix://localhost:80: No such file or directory
[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project mavenDemo: Exception caught: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.io.IOException: No such file or directory -> [Help 1]
這個(gè)是因?yàn)?Docker 服務(wù)沒(méi)有啟動(dòng)造成的,啟動(dòng) Docker 即可。
2、執(zhí)行 build images 時(shí),報(bào)錯(cuò)情況二:
ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on project mavenDemo: Exception caught: Request error: POST unix://localhost:80/build?t=mavenDemo: 500, body: {"message":"Error parsing reference: \"mavenDemo\" is not a valid repository/tag: repository name must be lowercase"}: HTTP 500 Internal Server Error -> [Help 1]
這個(gè)是因?yàn)殓R像名字不正確,Docker 鏡像名稱(chēng)需匹配[a-z0-9-_.]。
參考資料
到此這篇關(guān)于Maven插件docker-maven-plugin的使用的文章就介紹到這了,更多相關(guān)docker-maven-plugin 使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis聯(lián)合查詢的實(shí)現(xiàn)方法
本文主要介紹了 Mybatis聯(lián)合查詢的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01java數(shù)組算法例題代碼詳解(冒泡排序,選擇排序,找最大值、最小值,添加、刪除元素等)
這篇文章主要介紹了java數(shù)組算法例題代碼詳解(冒泡排序,選擇排序,找最大值、最小值,添加、刪除元素等),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05Java?restTemplate發(fā)送get請(qǐng)求query參數(shù)傳遞問(wèn)題解決
這篇文章主要為大家介紹了Java?restTemplate發(fā)送get請(qǐng)求query參數(shù)傳遞問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11使用json字符串插入節(jié)點(diǎn)或者覆蓋節(jié)點(diǎn)
這篇文章主要介紹了使用json字符串插入節(jié)點(diǎn)或者覆蓋節(jié)點(diǎn)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java 如何快速實(shí)現(xiàn)一個(gè)連接池
有沒(méi)有一個(gè)通用的庫(kù)可以快速實(shí)現(xiàn)一個(gè)線程池呢?得益于 Java 完善的生態(tài),前人們針對(duì)這種需要開(kāi)發(fā)了一個(gè)通用庫(kù):Apache Commons Pool(下文簡(jiǎn)稱(chēng) ACP)。本質(zhì)上來(lái)說(shuō),ACP 庫(kù)提供的是管理對(duì)象池的通用能力,當(dāng)然也可以用來(lái)管理連接池了!2021-05-05Java實(shí)現(xiàn)任務(wù)超時(shí)處理方法
任務(wù)超時(shí)處理是比較常見(jiàn)的需求,Java中對(duì)超時(shí)任務(wù)的處理有兩種方式,在文中給大家詳細(xì)介紹,本文重點(diǎn)給大家介紹Java實(shí)現(xiàn)任務(wù)超時(shí)處理方法,需要的朋友可以參考下2019-06-06Javabean簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Javabean簡(jiǎn)介,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07Java中SimpleDateFormat方法超詳細(xì)分析
這篇文章主要給大家介紹了關(guān)于Java中SimpleDateFormat方法超詳細(xì)分析的相關(guān)資料,SimpleDateFormat 是一個(gè)以國(guó)別敏感的方式格式化和分析數(shù)據(jù)的具體類(lèi),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08