Maven 插件 docker-maven-plugin 的使用配置


Maven 插件 docker-maven-plugin 的使用配置

1. docker-maven-plugin 介紹

在持續集成過程中,項目工程一般使用 Maven 編譯打包,后生成鏡像,通過上傳鏡像,能夠大大提高上線效率,同時能夠快速動態擴容,快速回滾。docker-maven-plugin 插件可以幫助我們在Maven工程中,通過簡單的配置,自動生成鏡像並推送到倉庫中。

2. 示例

2.1 配置 DOCKER_HOST

docker-maven-plugin 插件默認連接本地 Docker 地址為:localhost:2375,所以我們需要先設置下環境變量。

DOCKER_HOST=tcp://<host>:2375 

注意:如果沒有設置 DOCKER_HOST 環境變量,可以命令行顯示指定 DOCKER_HOST 來執行,如我本機指定 DOCKER_HOST:DOCKER_HOST=unix:///var/run/docker.sock mvn clean install docker:build

2.2 構建鏡像

構建鏡像可以使用一下兩種方式,第一種是將構建信息指定到 POM 中,第二種是使用已存在的 Dockerfile 構建。

  • 第一種方式,支持將 FROM, ENTRYPOINT, CMD, MAINTAINER 以及 ADD 信息配置在 POM 中,不需要使用 Dockerfile 配置
  • 第二種方式,如果使用 VOLUME 或其他 Dockerfile 中的命令的時候,需要創建一個 Dockerfile,並在 POM 中配置 dockerDirectory 來指定路徑即可。
2.2.1 指定構建信息到 pom.xml 中
<build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>${project.artifactId}:${project.version}</imageName> <baseImage>alpine-3.8.0-docker-image:2.0</baseImage> <maintainer>author author@email.com</maintainer> <workdir>/ROOT</workdir> <cmd>["java", "-version"]</cmd> <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint> <!-- 這里是復制 jar 包到 docker 容器指定目錄配置 --> <resources> <resource> <targetPath>/ROOT</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build> 
2.2.2 使用 Dockerfile 構建

pom.xml 文件配置

<build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>${project.artifactId}:${project.version}</imageName> <!-- 指定 Dockerfile 路徑--> <dockerDirectory>${basedir}/docker</dockerDirectory> <!-- 這里是復制 jar 包到 docker 容器指定目錄配置,也可以寫到 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 [author] [author@email.com]
WORKDIR /ROOT
CMD ["java", "-version"]
ENTRYPOINT ["java", "-jar", "${project.build.finalName}.jar"]

3. 綁定 Docker 命令到 Maven 各生命周期

綁定 Docker 命令到 Maven 各個階段,可以把 Docker 分為 build、tag、push,然后分別綁定 Maven 的 package、deploy 等階段,此時,我們只需要執行 mvn deploy 就可以完成整個 build、tag、push 操作了,當我們執行 mvn build 就只完成 build、tag 操作。此外當想跳過某些步驟或者只執行某個步驟時,不需要修改 POM 文件,只需要指定跳過 docker 某個步驟即可。比如當工程已經配置好了自動化模板了,但是這次我們只需要打鏡像到本地自測,不想執行 push 階段,那么此時執行要指定參數 -DskipDockerPush 就可跳過 push 操作了。

<build> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>${project.artifactId}:${project.version}</imageName> <!-- 指定 Dockerfile 路徑--> <dockerDirectory>${basedir}/docker</dockerDirectory> <!-- 這里是復制 jar 包到 docker 容器指定目錄配置,也可以寫到 Docokerfile 中 --> <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> </execution> <execution> <id>push-image</id> <phase>deploy</phase> <goals> <goal>push</goal> </goals> </execution> </executions> </plugin> </plugins> </build> 

當我們執行 mvn package 時,執行 build、tag 操作,當執行 mvn deploy 時,執行 build、tag、push 操作。如果想跳過 docker 某個過程時,只需要:

  • -DskipDockerBuild 跳過 build 鏡像
  • -DskipDockerTag 跳過 tag 鏡像
  • -DskipDockerPush 跳過 push 鏡像
  • -DskipDocker 跳過整個階段

例:我們想執行 package 時,跳過 tag 過程,那么就需要 mvn package -DskipDockerTag

3.1 安全認證配置
  1. 在 Maven 的配置文件 setting.xml 中增加相關 server 配置,主要配置 Docker registry 用戶認證信息。
<servers> <server> <id>docker-registry</id> <username>author-username</username> <password>author-password</password> <configuration> <email>author@mail.com</email> </configuration> </server> </servers> 
  1. 在 pom.xml 中使用 server id 配置。
<plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>${project.artifactId}:${project.version}</imageName> ... <serverId>docker-registry</serverId> </configuration> </plugin> </plugins> 
3.2 其他參數

docker-maven-plugin 插件還提供了很多很實用的配置參數

參數 說明 默認值
<forceTags>true</forceTags> build 時強制覆蓋 tag,配合 imageTags 使用 false
<noCache>true</noCache> build 時,指定 –no-cache 不使用緩存 false
<pullOnBuild>true</pullOnBuild> build 時,指定 –pull=true 每次都重新拉取基礎鏡像 false
<pushImage>true</pushImage> build 完成后 push 鏡像 false
<pushImageTag>true</pushImageTag> build 完成后,push 指定 tag 的鏡像,配合 imageTags 使用 false
<retryPushCount>5</retryPushCount> push 鏡像失敗,重試次數 5
<retryPushTimeout>10</retryPushTimeout> push 鏡像失敗,重試時間 10s
<rm>true</rm> build 時,指定 –rm=true 即 build 完成后刪除中間容器 false
<useGitCommitId>true</useGitCommitId> build 時,使用最近的 git commit id 前7位作為tag,例如:image:82016a5,前提是不配置 newName false

[注]: Docker 鏡像名稱需匹配[a-z0-9-_.] 。


docker 刪除容器的時候出現的 bug 解決方案 vi /etc/docker/daemon.json 的參數 "live-restore":false /usr/lib/systemd/system/docker.service 添加了參數 MountFlags=slave

轉自:https://my.oschina.net/u/3764794/blog/2995648


免責聲明!

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



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