本文主要介紹如何通過 docker-maven-plugin 插件把 Java 服務構建成 docker 鏡像;文中所使用到的軟體版本:Docker 20.10.17、Java 1.8.0_341、SpringBoot 2.7.12、Maven 3.8.4、docker-maven-plugin 1 ...
本文主要介紹如何通過 docker-maven-plugin 插件把 Java 服務構建成 docker 鏡像;文中所使用到的軟體版本:Docker 20.10.17、Java 1.8.0_341、SpringBoot 2.7.12、Maven 3.8.4、docker-maven-plugin 1.2.2。
1、docker-maven-plugin 插件信息
使用如下命令查看插件詳細信息:
mvn help:describe -DartifactId=docker-maven-plugin -DgroupId=com.spotify -Dversion=1.2.2 -Ddetail
1.1、插件目標
該插件包含 5 個目標:
目標 | 說明 |
docker:build | 構建鏡像 |
docker:help | 顯示幫助信息 |
docker:push | 上傳鏡像 |
docker:removeImage | 刪除鏡像 |
docker:tag | 給鏡像打標簽 |
1.2、常用配置參數
1.2.1、docker:build 參數
參數 | 說明 |
baseImage | 基礎鏡像,如果設置了 dockerDirectory,忽略該參數 |
buildArgs | 定義 docker build 時的參數,可以在 Dockerfile 文件中使用這些參數 |
cmd | 定義容器預設的運行程式,如果設置了 dockerDirectory,忽略該參數 |
dockerDirectory | Dockerfie 文件所在目錄(相對 pom.xml 的相對目錄),如果沒有配置該參數,將會根據 baseImage、entryPoint、cmd、maintainer 參數自動生成 Dockerfie |
dockerHost | docker 地址 |
entryPoint | 定義容器預設的運行程式,如果設置了 dockerDirectory,忽略該參數 |
imageName | 鏡像名稱 |
maintainer | 鏡像維護者,如果設置了 dockerDirectory,忽略該參數 |
resources | 定義構建鏡像所需的資源,這些資源會先 copy 到 Dockerfile 所在目錄下 |
resources/resource | 一個資源配置 |
resources/resource/targetPath | 定義資源 copy 到的目標目錄,該配置會在 Dockerfile 所在目錄中創建對應參數值的目錄 |
resources/resource/directory | 資源所在目錄 |
resources/resource/include | 資源包含的文件 |
1.2.2、docker:removeImage 參數
參數 | 說明 |
dockerHost | docker 地址 |
imageName | 刪除的鏡像名稱,包括 REPOSITORY 和 TAG |
imageTags | 與 imageName 中 REPOSITORY 一致, 其他需刪除的 TAG |
1.2.3、docker:tag 參數
參數 | 說明 |
dockerHost | docker 地址 |
image | 鏡像名稱或鏡像 id |
newName | 新的標簽名稱 |
1.2.4、docker:push 參數
參數 | 說明 |
serverId | 服務 id,對應 Maven settings.xml 中 servers/server 節點配置信息 |
registryUrl | 被推送的鏡像倉庫 |
imageName | 推送的鏡像名稱 |
2、docker-maven-plugin 插件使用
2.1、新建 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.2、在 POM 中設置 build 信息
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.2</version> <configuration> <dockerHost>http://10.49.196.33:2375</dockerHost> <baseImage>adoptopenjdk/openjdk8:latest</baseImage> <imageName>${project.artifactId}:${project.version}</imageName> <cmd>["java", "-jar", "/root/${project.build.finalName}.jar"]</cmd> <resources> <resource> <targetPath>/root</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
執行如下命令生成鏡像:
mvn package docker:build
先打包,然後生成鏡像;鏡像可在 docker 中查看:
2.3、使用 Dockerfile
2.3.1、新建 Dockerfile 文件
在項目下新建 docker 目錄,併在該目錄下新建 Dockerfile 文件:
Dockerfile 文件文件內容為:
From adoptopenjdk/openjdk8 ARG jarFile COPY ${jarFile} /root/demo-general-1.0.0.jar EXPOSE 9090 CMD ["java", "-jar", "/root/demo-general-1.0.0.jar"]
adoptopenjdk/openjdk8 為直接 pull 到本地的官方 jdk 鏡像。
2.3.2、docker-maven-plugin 插件配置
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.2</version> <configuration> <dockerHost>http://10.49.196.33:2375</dockerHost> <imageName>${project.artifactId}:${project.version}</imageName> <dockerDirectory>docker</dockerDirectory> <buildArgs> <jarFile>${project.build.finalName}.jar</jarFile> </buildArgs> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
執行如下命令生成鏡像:
mvn package docker:build
2.4、綁定 Docker 命令到 Maven 生命周期階段
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.2</version> <configuration> <dockerHost>http://10.49.196.33:2375</dockerHost> <imageName>${project.artifactId}:${project.version}</imageName> <dockerDirectory>docker</dockerDirectory> <buildArgs> <jarFile>${project.build.finalName}.jar</jarFile> </buildArgs> <resources> <resource> <targetPath>/</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>${project.artifactId}:${project.version}</image> <newName>10.49.196.34:18080/test/${project.artifactId}:${project.version}</newName> </configuration> </execution> <execution> <id>push-image</id> <phase>verify</phase> <goals> <goal>push</goal> </goals> <configuration> <serverId>my-harbor</serverId> <registryUrl>http://10.49.196.34:18080</registryUrl> <imageName>10.49.196.34:18080/test/${project.artifactId}:${project.version}</imageName> </configuration> </execution> </executions> </plugin>
上面的配置在打包階段綁定了生成鏡像及給鏡像打標簽的目標,執行 mvn package 命令後,到 docker 中查看鏡像信息:
在 verify 階段綁定了 push 鏡像的目標,在 Maven settings.xml 中配置遠程倉庫 Harbor 的用戶名密碼:
<servers> <server> <id>my-harbor</id> <username>admin</username> <password>Harbor12345</password> </server> </servers>
執行 mvn verify 命令後,到 Harbor 中查看鏡像信息:
3、替換插件
該插件在 Docker 的基礎上引入了額外的抽象和配置,容易給用戶帶來困擾;官網建議使用 dockerfile-maven-plugin 來替換該插件。
參考:https://github.com/spotify/docker-maven-plugin。