Maven 入門實戰(3)--docker-maven-plugin 插件使用

来源:https://www.cnblogs.com/wuyongyin/archive/2023/07/09/17457311.html
-Advertisement-
Play Games

本文主要介紹如何通過 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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如果模板里需要用變數填充表格,建議模板里的表格像word文件一樣建一個兩行的表格。但是這樣是freemaker是無法成功替換變數的,所以需要手動處理成到一個段里(如圖2),關於這點實在太無語了,因為沒有找到比較好的處理辦法,只能手工處理,在實際的開發工作中曾經花了幾個小時來做這件事情。根據模板文件生... ...
  • 一. 介紹 String、StringBuffer、StringBuilder: 前言: String、StringBuffer、StringBuilder 均在java.lang包下; String: 在Java中,String是一個特殊的引用類型,用於表示文本字元串。它提供了許多方法來操作和處理 ...
  • ## **Docker是什麼?** Docker是一個開源平臺,通過將應用程式隔離到輕量級、可移植的容器中,自動化應用程式的部署、擴展和管理。容器是獨立的可執行單元,封裝了運行應用程式所需的所有必要依賴項、庫和配置文件,可以在各種環境中穩定地運行。 # **什麼是容器?** 容器是一種輕量級、可移植 ...
  • - 背景: 經常創建和銷毀,使用量特別大的資源,比如併發情況下的線程,對性能影響很大。 - 思路:提前創建好多個線程,放入線程池中,使用時直接獲取,使用完放後池中。可以避免頻繁創建銷毀,實現重覆利用。類似生活中公共交通工具。 - 好處: - 提高響應速度(減少了創建新線程的時間) - 降低資源消耗( ...
  • **本文深入探討了 Django 中的請求與響應處理,從 Django 請求和響應的基礎知識、生命周期,到 HttpRequest 和 HttpResponse 對象的詳細介紹。同時,討論了 Django 的視圖和請求、響應處理,以及安全性和非同步處理的考慮。最後,對比了 Django 與 Flask ...
  • ### 三種創建方式 - Thread class 繼承Thread類 - Runnable介面 實現Runnable介面 - Callable介面 實現Callable介面 ### Thread - 自定義線程類繼承Thread類 - 重寫run()方法,編寫線程執行體 - 創建線程對象,調用st ...
  • python打包Windows.exe程式(pyinstaller) ## 基礎命令 `pip install pyinstaller` 使用pip命令來安裝pyinstaller模塊。 -F: `pyinstaller -F hello.py -p hello2.py` -D: `pyinstal ...
  • 編寫測試可以讓我們的代碼在後續迭代過程中不出現功能性缺陷問題;理解迭代器、閉包的函數式編程特性;`Box ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...