この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はい、どーも。モバイルアプリサービス部の吉田です。
今日は、Javaアプリケーションを簡単にDocker化できるツール、Jibを試してみたいと思います。
Jibとは
- Dockerfileを書かなくても、良い感じのDockerfileを生成してくれる
- DockerHub,Amazon ECR,Google Container Registryなどにpushしてくれる
など、いままでJavaアプリケーションをDocker化するにあたっての面倒な作業をやってくれるツールです。 また、既存のJavaアプリケーションに特に手を入れることなく、簡単にDocker化できるのも嬉しいポイントです。
導入方法
JibはMavenやGradleのプラグインが提供されていますので、これ経由で使うのが簡単です。今回はMavenのプラグインを使用しますが、Gradleプラグインでもほぼ同様です。
Docker化するアプリケーションはSpring Initializrで適当なSpring Bootアプリのスケルトンを使用しました。
対象のJavaアプリケーションのpom.xmlのbuildセクションにて、jib pluginを使うように記述を追加します。
<build>
<plugins>
...
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>0.9.2</version>
<configuration>
<to>
<image>hellojib</image>
</to>
</configuration>
</plugin>
</plugins>
</build>
これでJibを使う準備は完了ですので、まずはローカルにDockerイメージを登録してみましょう。Dockerイメージを生成しローカルへ登録するにはMavenから jib:dockerBuild
を実行します。
$ mvn compile jib:dockerBuild
正常に実行されたことを確認したらdocker images
でイメージ一覧に登録されているか確認してみましょう。
Amazon ECRへpushする
次はAmazon ECRへpushできるように設定を行います。予め、ECRのリポジトリは作成しておきます。
まずはECRに対してpushを行えるようamazon-ecr-credential-helperを導入します。
導入自体は簡単で以下のコマンドを実行するだけです。
$ go get -u github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cli/docker-credential-ecr-login
次に認証情報を設定します。
IAMでECRへpushする権限をもったユーザを作成し、環境変数AWS_ACCESS_KEY_ID
とAWS_SECRET_ACCESS_KEY
をセットします。自分はdirenvを使ってAWS_ACCESS_KEY_ID
とAWS_SECRET_ACCESS_KEY
を設定しました。
amazon-ecr-credential-helperがどの認証情報を参照しているかは、こちらを御覧ください。
その後、JibがECRへpushするようpom.xmlを以下のように修正します。
<build>
<plugins>
...
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>0.9.2</version>
<configuration>
<to>
<image>xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/hellojib</image>
</to>
</configuration>
</plugin>
</plugins>
</build>
imageの部分をECRのリポジトリに変更するだけです。その後Jibのjib:buildタスクを実行することで、ECRへpushが行われます。
$ mvn compile jib:build
指定できるオプションなど
Jibではその他にもさまざまなオプションがあり、pom.xmlにこれらを指定することで生成されるDockerfileを変更することができます。
例えば
<configuration>
<from>
<image>openjdk:alpine</image>
</from>
</configuration>
とすることで、ベースイメージを変えたり
<configuration>
<container>
<ports>
<port>8080</port>
</ports>
</container>
</configuration>
としてEXPOSE 8080
することもできます。