DockerのJavaアプリパッケージの代替バージョン

DockerでのJVMアプリケーションのパッキングに関する記事を読んだ後、私は混乱しました。 私は、開発者と同じように、髪を風になびかせたいのです。コンテナは、不要なジェスチャーなしで、すぐに1つのコマンドで実行されました。 プロジェクトとアセンブリの構成が1つのファイルに収集され、外部システムに依存しないようにします。



ご覧のとおり、Javaアプリケーション



以下は、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のドキュメントをご覧ください。



そしてそれだけです! その結果:





プラグインに関するいくつかの言葉:開発はアクティブで、メンテナーは即座に応答し、プールリクエストを容易に処理します。



»プラグイン自体はさらに多くのことができます: 機能

»サンプルプロジェクトがgithubに投稿されています



All Articles