Dockerでの
JVMアプリケーションのパッキングに関する記事を読んだ後、私は混乱しました。 私は、開発者と同じように
、髪を風になびかせたいのです。コンテナは、不要なジェスチャーなしで、すぐに1つのコマンドで実行されました。 プロジェクトとアセンブリの構成が1つのファイルに収集され、外部システムに依存しないようにします。
以下は、Mavenを使用してDockerコンテナでJavaアプリケーションを構築する代替方法です。
ビルドするには、Javaプロジェクト、Maven、およびすべてを完了するための少しの忍耐が必要です。
免責事項読者はすでにJava、Maven、およびDockerに精通していると思います。 Dockerファイルに書かれている内容を表します。なぜ彼はこれらすべてを必要とし、一般に忍者を必要としますか
今回は、
fabric8io Mavenプラグインを使用します。
mainメソッドを含むjarファイルにパッケージ化されたマイクロサービスがあり、アプリケーションを起動するために実行する必要があるとします。 プラグインをビルドセクションに追加します。
<plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.16.4</version> <executions> <execution> <id>Build docker container</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> <execution> <id>Push docker container</id> <phase>deploy</phase> <goals> <goal>push</goal> </goals> </execution> </executions> <configuration> <images> <image> <name>${project.artifactId}</name> <registry>registry.io</registry> <build> <from>java:8</from> <tags> <tag>${project.version}</tag> </tags> <ports> <port>8080</port> </ports> <cmd> <shell>java -cp 'jars/*' com.myapp.MainClass '/config.file'</shell> </cmd> <assembly> <basedir>/</basedir> <inline> <dependencySet> <outputDirectory>jars</outputDirectory> </dependencySet> <files> <file> <source>${project.build.directory}/${project.build.finalName}.jar</source> <outputDirectory>jars</outputDirectory> </file> <file> <source>${project.basedir}/src/main/config/config.yml</source> <outputDirectory>/</outputDirectory> </file> </files> </inline> </assembly> </build> </image> </images> </configuration> </plugin>
そして、一般に、それですべてです。 そこに何が書かれているかをより詳しく調べてみましょう。
最初に、バージョンを持つプラグインの典型的な定義があります。 次に、アセンブリ
月のどのフェーズを収集してコンテナをプッシュするかを決定します。 私の場合、コンテナの組み立て(ビルド)はプロジェクトのパッケージ化中に行われます(フェーズ:パッケージ)。
デプロイ段階で、コンテナのリポジトリへのプッシュ(プッシュ)が発生します。
<executions> <execution> <id>Build docker container</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> <execution> <id>Push docker container</id> <phase>deploy</phase> <goals> <goal>push</goal> </goals> </execution> </executions>
注意Maven!Mavenには、同じフェーズのさまざまなプラグインを、効果的なPOMに記載されている順序で起動するという獣姦的な習慣があります。 次のコマンドを使用して、効果的なpomを構築できます。
mvn help:effective-pom
何らかのトリックで正しい順序を取得できない場合は、コンテナの構築を次のフェーズであるインストール、デプロイに移行します。
たとえば、私の場合、展開フェーズへの転送は次のようになります。
<executions> <execution> <id>Build & Push docker container</id> <phase>deploy</phase> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions>
イメージ名とリポジトリを定義します。
<name>${project.artifactId}</name> <registry>registry.io</registry>
リポジトリが指定されていない場合、Dockerリポジトリが使用されます。 さらに読むための
ドキュメント 。
イメージアセンブリの説明は、<build>セクションで提供されます。 これは基本的に、MavenのDockerファイルを反映しています。
from-ベースイメージ
tags-画像が収集されるタグ
ポート-オープンポート
cmdは起動ラインです。entryPointを指定することもできます。 ドキュメントで利用可能なすべてのオプションについて読むことができます。
私の例では:
<shell>java -cp 'jars/*' com.myapp.MainClass '/config.file'</shell>
これは、MavenのビューでDockerシェルにラップされた典型的なJavaアプリケーション起動ラインです。
アセンブリはプラグインの最も興味深い部分です。 コンテナイメージに何をどのようにパッケージ化するかを決定します。 パッケージの説明にはいくつかのオプションがあり、インラインを選択しましたが、他の
オプションも
あります 。
この例では、プロジェクトのすべての依存関係を取得し、それらをjarsフォルダーに配置します。
<dependencySet> <outputDirectory>jars</outputDirectory> </dependencySet>
また、プロジェクトのアーティファクト、実際にはアプリケーションが存在し、構成ファイルはコンテナのルートにあります。
<files> <file> <source>${project.build.directory}/${project.build.finalName}.jar</source> <outputDirectory>jars</outputDirectory> </file> <file> <source>${project.basedir}/src/main/config/config.file</source> <outputDirectory>/</outputDirectory> </file> </files>
アセンブリ機能の詳細については、今度はMavenの
ドキュメントをご覧ください。
そしてそれだけです! その結果:
- Dockerコンテナのアセンブリの構成全体がプロジェクトファイルに集中しています。
- Mavenの魅力、変数、プラグインをすべて使用できます。
- コンテナの組み立ては透過的に行われ、プロジェクトの組み立て時に、結果はローカルで利用可能です。
- コンテナのバージョン管理は、設計に対応しています。
- 以前と同じCI / CDツールを引き続き使用できます(サーバーにDockerをインストールする必要があります)。
プラグインに関するいくつかの言葉:開発はアクティブで、メンテナーは即座に応答し、プールリクエストを容易に処理します。
»プラグイン自体はさらに多くのことができます:
機能»サンプルプロジェクトが
githubに投稿されています