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コンテナ練習用イメージウェアハウス

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

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

推薦する

M1 ProチップでVueプロジェクトを開始する方法

目次導入Homebrewをインストールするnvmをインストールするノードをインストールするインストー...

LinuxでVIMエディタを使う方法

豊富なオプションを備えた強力なエディターとして、Vim は多くのユーザーに愛されています。この記事で...

ウェブタイポグラフィにおける致命的な意味的ミス 10 選

<br />これは、Steven D が書いた Web フロントエンド開発デザインの基本...

axios リクエストのカプセル化に基づく Vue アプリケーションのサンプルコード

目次axiosとは何ですか? Axios リクエストタイプ? Axiosはデフォルトのカスタム構成を...

Dockerfile を使用して nginx イメージを構築する例

Dockerfile の紹介Docker は、Dockerfile の内容を読み取ってイメージを自動...

Angularの親子コンポーネント通信の詳細な説明

目次使用されるAPI簡単な例人.ts親コンポーネントサブコンポーネント効果要約する使用されるAPI ...

MySQL 8.0.15 winx64 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.15のインストールと設定方法を参考までに紹介します。具体的な内容は...

Linux ドライバ開発でよく使われる関数 copy_from_user open read write の詳細な説明

目次Linux ドライバーの共通機能 (copy_from_user open read write...

JavaScript 配列のマージのケーススタディ

方法1: var a = [1,2,3]; var b = [4,5] b を連結します。 コンソー...

実行中の Docker コンテナにボリュームを動的に追加する方法

以前、Docker コンテナの起動後にボリュームをマウントできるかどうか尋ねられたことがあります。m...

Vueを使用して手書き署名機能を実装する

個人的な実装のスクリーンショット:インストール: npm インストール vue-esign --sa...

Linux でリモート MySQL データベースを手動で展開する方法の詳細な説明

1. mysql をインストールします。次のコマンドを実行して、YUM ソースを更新します。 rpm...

ホストサービスにアクセスするDockerでのサービスの実装

目次1. シナリオ2. 解決策3. 結論4. 参考文献1. シナリオ日常の開発およびテスト作業には ...

Linuxにおけるselinuxの基本設定チュートリアルの詳細な説明

selinux ( Security-Enhanced Linux)は、Linux カーネル モジュ...

インターフェース設計の10の一般的なルール

<br />これは私がずっと前に集めた記事です。皆さんの参考のために共有したいと思います...