Googleは、DockerのインストールやDockerデーモンの実行、さらにはDockerfileの作成も行うことなく、Javaアプリケーションをコンテナ化できるオープンソースツール「Jib」を正式リリースした。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Googleは2019年2月12日(米国時間)、DockerのインストールやDockerデーモンの実行、さらにはDockerfileの作成を行うことなく、Javaアプリケーションを最小限の労力でコンテナ化できるオープンソースツール「Jib 1.0.0」の正式版の提供開始を発表した。
Jibプラグインを「Maven」ビルドや「Gradle」ビルドに適用し、ビルドを実行すれば、Jibがそのビルド情報を使って、アプリケーションを迅速かつ効率的、自動的にコンテナ化する。「Jibを使えば、JavaコンテナのビルドはJARのパッケージ化並みに簡単だ」とGoogleは述べている。
Googleは2018年にJibのβ版をリリースし、今回のJib 1.0.0のリリースまでに、コミュニティーのフィードバックや貢献を踏まえて改良を加えてきた。主な改良点は以下の通り。
JavaベースのWebアプリケーションは「WARファイル」としてパッケージ化されていることが多い。Jibは、特別な構成を行わなくても、WARプロジェクトをコンテナ化できるようになった。次のように実行する。
$ mvn package jib:build
$ gradle jib
コンテナのデフォルトアプリケーションサーバは「Jetty」だが、ベースイメージと「appRoot」を次のように構成して、「Tomcat」のような別のサーバを使うこともできる。
<configuration> <from> <image>tomcat:8.5-jre8-alpine</image> </from> <to> <image>gcr.io/my-project/my-war-image</image> </to> <container> <appRoot>/usr/local/tomcat/webapps/my-webapp</appRoot> </container> </configuration>
jib { from.image = 'tomcat:8.5-jre8-alpine' to.image = 'gcr.io/my-project/my-war-image' container.appRoot = '/usr/local/tomcat/webapps/my-webapp' }
「Skaffold」は、「Kubernetes」で継続的な開発を行うためのコマンドラインツールだ。GoogleはSkaffoldとJibを統合し、Kubernetesでシームレスに開発を行えるようにした。JibはSkaffoldでビルダーとして利用できる。
JavaプロジェクトでSkaffoldを使うには、Skaffoldをインストールし、「skaffold.yaml」をプロジェクトに追加する。
skaffold.yaml: apiVersion: skaffold/v1beta4 kind: Config build: artifacts: - image: gcr.io/my-project/my-java-image # Use this for a Maven project: jibMaven: {} # Use this for a Gradle project: jibGradle: {}
Kubernetesマニフェストを「k8s/」ディレクトリに置き、コンテナ仕様におけるイメージ参照を「gcr.io/my-project/my-java-image」と一致させる。
続いて、次のコマンドでSkaffoldの継続的開発を開始する。
$ skaffold dev --trigger notify
Skaffoldは、変更を行うたびにアプリケーションの再ビルドと再デプロイの実行に伴う面倒なステップを不要にする。これは、変更を検出するたびに、Jibでアプリケーションをコンテナ化し、Kubernetesクラスタにデプロイすることで実現できる。
Jibは、コンテナイメージをビルドするための独自の汎用(はんよう)ライブラリを使って動作する。このライブラリは「Jib Core」としてリリースされている。JibをMavenやGradleのプラグインとして使うだけでなく、任意のアプリケーションでDockerデーモンを使うことなく、Javaでコンテナ化できる。
Jib Coreを使うには、次のようにプロジェクトに追加する。
<dependency> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-core</artifactId> <version>0.1.1</version> </dependency>
dependencies { implementation 'com.google.cloud.tools:jib-core:0.1.1' }
シンプルなDockerイメージをビルドする例を以下に示す。ベースイメージからスタートして、1つのレイヤーを追加し、エントリポイントを設定した上で、リモートレジストリにプッシュしている。
Jib.from("busybox") .addLayer(Arrays.asList(Paths.get("helloworld.sh")), AbsoluteUnixPath.get("/")) .setEntrypoint("sh", "/helloworld.sh") .containerize( Containerizer.to(RegistryImage.named("gcr.io/my-project/hello-from-jib") .addCredential("myusername", "mypassword")));
Jibでは、正式リリースまでにこれらの改良が行われた。JibによるJavaアプリケーションのコンテナ化は、これまで通り簡単だ。Mavenを使っている場合は、プラグインをpom.xmlに追加する。
<plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <to> <image>gcr.io/my-project/my-java-image</image> </to> </configuration> </plugin>
イメージをビルドしてコンテナレジストリにプッシュするには、次のコマンドを使用する。
$ mvn compile jib:build
Dockerデーモンを実行してビルドする場合は、次のコマンドを使用する。
$ mvn compile jib:dockerBuild
次のような呼び出しを行えば、pom.xmlを変更せずにアプリケーションをコンテナ化できる。
$ mvn compile com.google.cloud.tools:jib-maven-plugin:1.0.0:build -Dimage=gcr.io/my-project/my-java-image
GradleでJibを使う場合は、プラグインをbuild.gradleに追加する。
plugins { id 'com.google.cloud.tools.jib' version '1.0.0' } jib.to.image = 'gcr.io/my-project/my-java-image'
次のコマンドでアプリケーションをコンテナ化し、コンテナレジストリにプッシュできる。
$ gradle jib
また、Dockerデーモンを実行してコンテナ化を行える。
$ gradle jibDockerBuild
Copyright © ITmedia, Inc. All Rights Reserved.