Javaアプリケーションを簡単にDocker化できるJibを触ってみた
はい、どーも。モバイルアプリサービス部の吉田です。
今日は、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
することもできます。