docker-maven-pluginはイメージをパッケージ化し、プライベートウェアハウスにアップロードします。

docker-maven-pluginはイメージをパッケージ化し、プライベートウェアハウスにアップロードします。

1. docker-maven-pluginの紹介

私たちの継続的インテグレーションプロセスでは、プロジェクトエンジニアリングでは通常、Maven を使用してコンパイルおよびパッケージ化し、イメージを生成します。イメージをオンラインにすることで、オンライン効率が大幅に向上すると同時に、容量を迅速かつ動的に拡張し、迅速にロールバックできるため、非常に便利です。 docker-maven-plugin プラグインは、Maven プロジェクトでの簡単な構成を通じて、イメージを自動的に生成し、ウェアハウスにプッシュできるように設計されています。

2. 環境とソフトウェアの準備

このデモ環境では、ローカルの Mac OX で操作しました。インストールされているソフトウェアとバージョンは次のとおりです。

  • Docker: バージョン 17.03.1-ce
  • Maven: バージョン 3.3.9
  • Java: バージョン 1.8.0_91
  • docker-maven-プラグイン:1.0.0

注: ここでは、docker-maven プラグインを使用してイメージのビルド、イメージのアップロード、およびその他の操作を実行する Java Maven プロジェクトをテストするため、最初に Docker、Maven、および Java をインストールする必要があります。ここではインストール プロセスは無視されます。

3. デモ例

3.1 DOCKER_HOSTの設定

docker-maven-plugin プラグインのローカル Docker へのデフォルトの接続アドレスは localhost:2375 なので、最初に環境変数を設定する必要があります。

DOCKER_HOST=tcp://<ホスト>:2375

注: DOCKER_HOST 環境変数が設定されていない場合は、コマンド ラインで DOCKER_HOST を指定して実行できます。たとえば、ローカル マシンで DOCKER_HOST を指定します: DOCKER_HOST=unix:///var/run/docker.sock mvn clean install docker:build。

3.2 イメージ構築の例

イメージをビルドする方法は 2 つあります。1 つ目は POM でビルド情報を指定する方法、2 つ目は既存の Dockerfile を使用してビルドする方法です。
最初の方法では、Dockerfile 構成を使用せずに、POM で FROM、ENTRYPOINT、CMD、MAINTAINER、ADD 情報を構成することをサポートします。ただし、Dockerfile で VOLUME などのコマンドを使用する場合は、2 番目の方法を使用して、Dockerfile を作成し、POM で dockerDirectory を構成してパスを指定する必要があります。

ここでは、Java Maven プロジェクト mavendemo を例として説明します。

3.2.1 POMでビルドするためのビルド情報を指定する

<ビルド>
    <プラグイン>
        <プラグイン>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <バージョン>1.0.0</バージョン>
            <構成>
                <imageName>mavendemo</imageName>
                <baseImage>java</baseImage>
                <maintainer>docker_maven [email protected]</maintainer>
                <作業ディレクトリ>/ROOT</作業ディレクトリ>
                <cmd>["java", "-version"]</cmd>
                <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint>
                <!-- 以下は、jar パッケージを docker コンテナの指定されたディレクトリにコピーするための構成です -->
                <リソース>
                    <リソース>
                        <ターゲットパス>/ROOT</ターゲットパス>
                        <ディレクトリ>${project.build.directory}</ディレクトリ>
                        <include>${project.build.finalName}.jar</include>
                    </リソース>
                </リソース>
            </構成>
        </プラグイン>
    </プラグイン>
</ビルド>

3.2.2 Dockerfileを使用したビルド

pom.xml 構成

<ビルド>
    <プラグイン>
         <プラグイン>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <バージョン>1.0.0</バージョン>
            <構成>
                <imageName>mavendemo</imageName>
                <dockerDirectory>${basedir}/docker</dockerDirectory> <!-- Dockerfile パスを指定します -->
                <!-- ここでは、jar パッケージを docker コンテナの指定されたディレクトリ構成にコピーします。これは Dokokerfile に書き込むこともできます -->
                <リソース>
                    <リソース>
                        <ターゲットパス>/ROOT</ターゲットパス>
                        <ディレクトリ>${project.build.directory}</ディレクトリ>
                        <include>${project.build.finalName}.jar</include>
                    </リソース>
                </リソース>
            </構成>
        </プラグイン>   
    </プラグイン>
</ビルド>
 
${basedir}/docker/Dockerfile 設定 FROM java
メンテナー docker_maven [email protected]
ワークディレクトリ /ルート
CMD ["java", "-version"]
エントリポイント ["java", "-jar", "${project.build.finalName}.jar"]

上記の 2 つの docker:build 実行方法は同じ効果があります。実行出力プロセスは次のとおりです。

[情報] --- docker-maven-plugin:1.0.0:build (default-cli) @ mavenDemo ---
[INFO] 建物イメージ mavendemo
ステップ 1/5: Java から
---> d23bdf5b1b1b
ステップ 2/5: MAINTAINER docker_maven [email protected]
---> キャッシュの使用
---> 2faf180d4a50
ステップ 3/5: WORKDIR /ROOT
---> キャッシュの使用
---> 862210f7956a
ステップ 4/5: ENTRYPOINT java -jar mavenDemo.jar
---> 96bbe83de6ec で実行中
---> c29009c88993
中間コンテナを削除しています 96bbe83de6ec
ステップ 5/5: CMD java -version
---> f69b8d2a75b1 で実行中
---> bc8d54014325
中間コンテナ f69b8d2a75b1 を削除しています
正常に構築されました bc8d54014325

実行が完了したら、docker images を使用して生成されたイメージを表示します。

リポジトリ タグ イメージ ID 作成 サイズ
mavendemo 最新 333b429536b2 38 分前 643 MB

3.3 コマンドの実行

mvn clean package docker:buildはビルド操作のみを実行します

mvn clean package docker:build -DpushImage はビルドを実行し、完了後にイメージをプッシュします。

mvn clean package docker:build -DpushImageTag はビルドを実行し、指定されたタグのイメージをプッシュします。

注: ここでは少なくとも 1 つの imageTag を指定する必要があります。これは POM で構成するか、コマンド ラインで指定できます。コマンドラインは次のように指定されます: mvn clean package docker:build -DpushImageTags -DdockerImageTags=imageTag_1 -DdockerImageTags=imageTag_2、POM ファイルで指定される構成は次のとおりです:

<ビルド>
  <プラグイン>
    ...
    <プラグイン>
      <構成>
        ...
        <画像タグ>
           <imageTag>imageTag_1</imageTag>
           <imageTag>imageTag_2</imageTag>
        </画像タグ>
      </構成>
    </プラグイン>
    ...
  </プラグイン>
</ビルド>

3.4 DockerコマンドをMavenステージにバインドする

Docker コマンドをさまざまな Maven ステージにバインドできます。Docker をビルド、タグ、プッシュに分割し、それぞれ Maven のパッケージ ステージとデプロイ ステージにバインドできます。この時点で、ビルド、タグ、プッシュ操作全体を完了するには、mvn deploy を実行するだけで済みます。mvn build を実行すると、ビルドとタグ操作のみが完了します。さらに、特定のステップをスキップしたり、特定のステップのみを実行したりする場合は、POM ファイルを変更する必要はなく、特定の docker ステップをスキップするように指定するだけで済みます。たとえば、プロジェクトで自動化テンプレートがすでに構成されているが、今回はローカルセルフテストにイメージをビルドするだけで、プッシュステージを実行したくない場合は、プッシュ操作をスキップするためにパラメーター -DskipDockerPush を指定する必要があります。

<ビルド>
    <プラグイン>
        <プラグイン>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <バージョン>1.0.0</バージョン>
            <構成>
                <imageName>mavendemo</imageName>
                <baseImage>java</baseImage>
                <maintainer>docker_maven [email protected]</maintainer>
                <作業ディレクトリ>/ROOT</作業ディレクトリ>
                <cmd>["java", "-version"]</cmd>
                <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint>
                <リソース>
                    <リソース>
                        <ターゲットパス>/ROOT</ターゲットパス>
                        <ディレクトリ>${project.build.directory}</ディレクトリ>
                        <include>${project.build.finalName}.jar</include>
                    </リソース>
                </リソース>
            </構成>
            <処刑>
                <実行>
                    <id>ビルドイメージ</id>
                    <phase>パッケージ</phase>
                    <目標>
                        <goal>ビルド</goal>
                    </目標>
                </実行>
                <実行>
                    <id>タグ画像</id>
                    <phase>パッケージ</phase>
                    <目標>
                        <goal>タグ</goal>
                    </目標>
                    <構成>
                        <image>mavendemo:latest</image>
                        <新しい名前>docker.io/wanyang3/mavendemo:${プロジェクトバージョン}</新しい名前>
                    </構成>
                </実行>
                <実行>
                    <id>プッシュイメージ</id>
                    <phase>デプロイ</phase>
                    <目標>
                        <goal>プッシュ</goal>
                    </目標>
                    <構成>
                        <イメージ名>docker.io/wanyang3/mavendemo:${プロジェクトバージョン}</イメージ名>
                    </構成>
                </実行>
            </処刑>
        </プラグイン>
    </プラグイン>
</ビルド>

上記の例では、mvn package を実行するとビルドとタグの操作が実行され、mvn deploy を実行するとビルド、タグ、プッシュの操作が実行されます。 docker プロセスをスキップしたい場合は、次の操作を行うだけです。

  • -DskipDockerBuildはイメージのビルドをスキップします
  • -DskipDockerTag タグ画像をスキップ
  • -DskipDockerPushはイメージのプッシュをスキップします
  • -DskipDockerはステージ全体をスキップします

たとえば、パッケージを実行するときにタグ処理をスキップしたい場合は、mvn package -DskipDockerTag が必要です。

3.5 プライベートDockerリポジトリアドレスの使用

実際の作業環境では、イメージをプライベート Docker リポジトリにプッシュする必要があります。これは、docker-maven-plugin プラグインを使用して実現することも非常に簡単です。実現するにはいくつかの方法があります。

1. POMファイルのimageName操作を変更する

...
<構成>
    <imageName>registry.example.com/wanyang3/mavendemo:v1.0.0</imageName>
    ...
</構成>
...

2. POMファイル内のnewName操作を変更する

...
<構成>
    <imageName>mavendemo</imageName>
    ...
</構成>
<実行>
    <id>タグ画像</id>
    <phase>パッケージ</phase>
    <目標>
        <goal>タグ</goal>
    </目標>
    <構成>
        <image>mavendemo</image>
        <newName>registry.example.com/wanyang3/mavendemo:v1.0.0</newName>
    </構成>
</実行>
...

3.6 セキュリティ認証構成

イメージを Docker リポジトリにプッシュする場合、共有リポジトリかプライベートリポジトリかに関係なく、セキュリティ認証が必要になることが多く、ログインが完了した後にのみ操作を実行できます。もちろん、コマンドライン docker login -u user_name -p password docker_registry_host からログインすることもできますが、自動化されたプロセスにはあまり便利ではありません。 docker-maven-plugin プラグインを使用すると、セキュリティ認証を簡単に実装できます。

まず、Maven 構成ファイル setting.xml に関連するサーバー構成を追加し、主に Docker レジストリのユーザー認証情報を構成します。

<サーバー>
  <サーバー>
    <id>私のDockerレジストリ</id>
    <ユーザー名>wanyang3</ユーザー名>
    <パスワード>12345678</パスワード>
    <構成>
      <メール>[email protected]</メール>
    </構成>
  </サーバー>
</サーバー>

次に、pom.xml でサーバー ID を使用します。

<プラグイン>
  <プラグイン>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <バージョン>1.0.0</バージョン>
    <構成>
      <imageName>registry.example.com/wanyang3/mavendemo:v1.0.0</imageName>
      ...
      <serverId>my-docker-registry</serverId>
    </構成>
  </プラグイン>
</プラグイン>

3.7 その他のパラメータ

docker-maven-plugin プラグインも多くの便利な設定を提供します。ここにいくつかのパラメータを示します。

パラメータ例示するデフォルト値
<forceTags>true</forceTags>ビルド時にタグを強制的に上書きします。imageTags と一緒に使用します。間違い
<noCache>true</noCache>ビルド時にキャッシュを使用しない場合は--no-cacheを指定します間違い
<pullOnBuild>true</pullOnBuild>ビルド時に、--pull=trueを指定してベースイメージを毎回再プルします。間違い
<pushImage>true</pushImage>ビルドが完了したら、イメージをプッシュします間違い
<pushImageTag>true</pushImageTag>ビルドが完了したら、指定したタグのイメージをプッシュし、imageTagsで使用します。間違い
<retryPushCount>5</retryPushCount>イメージのプッシュに失敗しました。再試行回数5
<retryPushTimeout>10</retryPushTimeout>イメージのプッシュに失敗しました。再試行時間です10秒
<rm>true</rm>ビルド時に –rm=true を指定すると、ビルド完了後に中間コンテナが削除されます。間違い
<useGitCommitId>true</useGitCommitId>ビルド時に、最新のgitコミットIDの最初の7桁をタグとして使用します。例:image:b50b604(newNameが設定されていない場合)間違い

4. よくある質問

1. ビルドイメージを実行すると、エラー 1 が発生します。

[INFO] 建物イメージ mavendemo
org.apache.http.impl.execchain.RetryExec 実行
{}->unix://localhost:80 へのリクエストの処理中に I/O 例外 (java.io.IOException) が発生しました: そのようなファイルまたはディレクトリはありません
[エラー] プロジェクト mavenDemo で目標 com.spotify:docker-maven-plugin:1.0.0:build (default-cli) を実行できませんでした: 例外をキャッチしました: java.util.concurrent.ExecutionException: com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: java.io.IOException: そのようなファイルまたはディレクトリはありません -> [ヘルプ 1]

これは Docker サービスが開始されていないためです。Docker を開始してください。

2. ビルド イメージを実行すると、エラー 2 が報告されます。

エラー] プロジェクト mavenDemo で目標 com.spotify:docker-maven-plugin:1.0.0:build (default-cli) を実行できませんでした: 例外がキャッチされました: リクエスト エラー: POST unix://localhost:80/build?t=mavenDemo: 500、本文: {"message":"参照の解析エラー: \"mavenDemo\" は有効なリポジトリ/タグではありません: リポジトリ名は小文字にする必要があります"}: HTTP 500 内部サーバー エラー -> [ヘルプ 1]

これはイメージ名が間違っているためです。Docker イメージ名は [a-z0-9-_.] と一致する必要があります。

docker-maven-plugin のパッケージングイメージとプライベートリポジトリへのアップロードに関するこの記事はこれで終わりです。docker-maven-plugin のパッケージングイメージの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker buildx を使用してマルチプラットフォーム イメージをビルドし、プライベート リポジトリにプッシュする方法
  • Dockerを使用してクローンリポジトリを使用してGitイメージを構築する
  • Docker用国産イメージウェアハウスの使い方
  • Jenkins は Docker イメージを構築し、Harbor ウェアハウスにプッシュします
  • Dockerイメージリポジトリの使い方
  • Docker プライベート イメージ リポジトリの Alibaba Cloud 展開手順
  • Dockerコンテナ練習用イメージウェアハウス

<<:  ウェブサイトでページコンテンツや情報を直接コピーできない問題を解決する方法

>>:  フレックスレイアウトによるシームレスなスクロールのサンプルコード

推薦する

JavaScript Reduceの詳しい説明

目次地図フィルターいくつかの毎インデックスを検索パイプ参考回答1. パラメータを受け入れる関数を返す...

Docker クロスサーバー通信オーバーレイソリューション (パート 1) Consul 単一インスタンス

目次シナリオタスクアイデア分析するコンセプトと選択ちょっとしたテスト環境説明予防実践テスト引用シナリ...

Linuxの貼り付けコマンドの使い方

01. コマンドの概要貼り付けコマンドは各ファイルを列ごとに結合します。これは、2 つの異なるファイ...

Zabbixを介してデータベース接続情報といくつかの拡張機能をすばやく取得します

背景アプリケーション システムの数が増え続けると、当初はアラームを発していなかったアクティブ スレッ...

MySQL でタイムゾーンを表示および変更する方法

今日、プログラムが間違った時刻を挿入し、フィールドがデフォルト値 CURRENT_TIMESTAMP...

mysql 8.0.15 winx64 解凍バージョン グラフィック インストール チュートリアル

システムをインストールした後、毎回いくつかのソフトウェアを再インストールする必要があります。ソフトウ...

Centos7.3 で mysql5.7.18 をインストールして初期パスワードを変更する方法

この記事では、Centos7.3でのmysql5.7.18のインストールと初期パスワードの変更につい...

MySQL 無料インストール版 (zip) のインストールと設定の詳細なチュートリアル

この記事では、MySQL無料インストール版(zip)のインストールと設定のチュートリアルを参考までに...

VUEはトークンログイン認証を実装

この記事では、トークンログイン認証を実装するためのVUEの具体的なコードを例として紹介します。具体的...

JavaScript におけるセミコロンの詳細

序文JavaScript ではセミコロンはオプションであり、使用するかどうかは主にコーディング スタ...

関数の分類の詳細な説明とJavascriptでのこのポイントの例

JS で関数を定義する 3 つの方法例を挙げて説明しましょう。 <スクリプト> //メソ...

アイデア展開Tomcatサービス実装プロセス図

まずプロジェクトの成果物を構成するスタートアップ項目の設定 Tomcatサービスを作成する開始したい...

MYSQLはUnionを使用して2つのテーブルのデータを結合し、表示します。

UNION演算子の使用union : 2 つ以上の SELECT ステートメントの結果を 1 つの...

Linux seqコマンドの使い方

1. コマンドの紹介seq (シーケンス) コマンドは、指定されたステップ サイズに従って、開始番号...

Windows に Docker をインストールする詳細なチュートリアル

ローカルの MySQL バージョンが比較的低いため、最近 MySQL のバージョンをアップグレードす...