本文主要介紹如何通過 dockerfile-maven-plugin 插件把 Java 服務構建成 docker 鏡像;文中所使用到的軟體版本:Docker 20.10.17、Java 1.8.0_341、SpringBoot 2.7.12、Maven 3.8.4、dockerfile-maven- ...
本文主要介紹如何通過 dockerfile-maven-plugin 插件把 Java 服務構建成 docker 鏡像;文中所使用到的軟體版本:Docker 20.10.17、Java 1.8.0_341、SpringBoot 2.7.12、Maven 3.8.4、dockerfile-maven-plugin 1.4.13。
1、dockerfile-maven 插件信息
使用如下命令查看插件概要信息:
mvn help:describe -DartifactId=dockerfile-maven-plugin -DgroupId=com.spotify -Dversion=1.4.13 -Ddetail
1.1、插件目標
該插件包含 4 個目標:
目標 | 說明 | 預設綁定階段 |
dockerfile:build | 構建鏡像 | package |
dockerfile:help | 顯示幫助信息 | |
docker:push | 上傳鏡像 | deploy |
docker:tag |
給鏡像打標簽,因為是根據鏡像 id 來打標簽的,所以需要先 dockerfile:build(會緩存鏡像 id),然後才能 dockerfile:tag mvn clean 所以信息都會清除,需要重新打包及構建鏡像 |
package |
1.2、常用配置參數
1.2.1、dockerfile:build 參數
參數 | 說明 |
buildArgs | 定義 docker build 時的參數,可以在 Dockerfile 文件中使用這些參數 |
contextDirectory | 構建鏡像的工作目錄,通常是包含 Dockerfile 文件的目錄,預設為:${project.basedir} |
noCache | 構建鏡像時是否使用緩存,預設:false |
pullNewerImage | 是否自動更新基礎鏡像,預設:true |
repository | 鏡像的倉庫源 |
tag | 鏡像的標簽 |
1.2.2、dockerfile:tag 參數
參數 | 說明 |
repository | 鏡像的倉庫源 |
tag | 鏡像的標簽 |
1.2.3、dockerfile:push 參數
參數 | 說明 |
repository | 鏡像的倉庫源 |
tag | 鏡像的標簽 |
useMavenSettingsForAuth | 是否使用 Maven 配置來認證,預設:false |
2、dockerfile-maven 插件使用
2.1、設置 DOCKER_HOST 環境變數
2.2、新建 SpringBoot 工程
<groupId>com.abc</groupId> <artifactId>demo-general</artifactId> <version>1.0.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.12</version> <relativePath /> </parent>
2.3、新建 Dockerfile
在該目錄下新建 Dockerfile 文件:
Dockerfile 文件文件內容為:
From adoptopenjdk/openjdk8:latest ARG jarFile COPY target/${jarFile} /root/${jarFile} EXPOSE 9090 CMD ["java", "-jar", "/root/${jarFile}"]
2.4、插件使用
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.13</version> <configuration> <repository>${project.artifactId}</repository> <tag>${project.version}</tag> <buildArgs> <jarFile>${project.build.finalName}.jar</jarFile> </buildArgs> </configuration> </plugin>
執行 mvn package dockerfile:build 命令,在 docker 中查看鏡像:
2.5、綁定 Docker 命令到 Maven 生命周期階段
<plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.13</version> <configuration> <repository>${project.artifactId}</repository> <tag>${project.version}</tag> <buildArgs> <jarFile>${project.build.finalName}.jar</jarFile> </buildArgs> </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> <repository>10.49.196.34:18080/test/${project.artifactId}</repository> <tag>${project.version}</tag> </configuration> </execution> <execution> <id>push-image</id> <phase>verify</phase> <goals> <goal>push</goal> </goals> <configuration> <repository>10.49.196.34:18080/test/${project.artifactId}</repository> <tag>${project.version}</tag> <useMavenSettingsForAuth>true</useMavenSettingsForAuth> </configuration> </execution> </executions> </plugin>
上面的配置在打包階段綁定了生成鏡像及給鏡像打標簽的目標,執行 mvn package 命令後,到 docker 中查看鏡像信息:
在 verify 階段綁定了 push 鏡像的目標,在 Maven settings.xml 中配置遠程倉庫 Harbor 的用戶名密碼:
<servers> <server> <id>10.49.196.34:18080</id> <username>admin</username> <password>Harbor12345</password> </server> </servers>
執行 mvn verify 命令後,到 Harbor 中查看鏡像信息:
參考:https://github.com/spotify/dockerfile-maven。