この記事はJX通信社Advent Calendarの9日目です。
Androidエンジニアのsakebookです。NewsDigestというアプリを開発しています。
普段は業務でKotlinばかり触る自分が紹介するのは「jib」というツールです。
jib
jibはJavaのアプリケーションをOCI Image Formatに則った形式でDockerイメージにしてくれるツールです。
jibを使うことで利用者は既存のJavaアプリケーションを少しの作業でDockerイメージにできます。
jib自体を簡単に使うためにMavenとGradleのプラグインが合わせて公開されています。
今回はGradleプラグインでの利用方法の紹介をします。
導入
既存のアプリケーションにプラグインを追加するだけで利用できます。
- build.gradle
plugins { ... id 'com.google.cloud.tools.jib' version '0.10.1' }
ターミナルで次のように実行すればDockerイメージが作成されます。
$ ./gradlew jibDockerBuild
Dockerfileの生成のタスクもあったんですが、0.10.1で削除されました。
デフォルトで利用されるベースイメージはDistrolessと呼ばれるものを利用します。
これはExecutableなDockerイメージで、shellすらもないイメージです。そのため、jibで生成されるイメージは必要最低限のものになり、軽量なものになります。
Registryに登録
プラグインでは作成したイメージをRegistryに登録することもサポートしています。Credential Helperにも対応しており、設定していると次のようにシンプルに書けます。
- build.gradle
jib.to.image = 'gcr.io/REPLACE-WITH-YOUR-GCP-PROJECT/image-built-with-jib'
直接認証する場合の例は次のようになります。
- build.gradle
jib {
to {
image = "registry.hub.docker.com/XXXXXXX/YYYYYYYY"
auth {
username = USERNAME
password = PASSWORD
}
}
}
DockerHubの USERNAME
と PASSWORD
は何らかの方法で渡します。 gradle.properties
とかが簡単です。
- gradle.properties
USERNAME=YOUR_USERNAME PASSWORD=YOUR_PASSWORD
次のコマンドを実行すると指定したRegistryにイメージがPushされます。デフォルトだとDockerHubです。
$ ./gradlew jib
ファイル作成が手間だったら引数に渡すこともできます。
$ ./gradlew jib \ -Djib.to.auth.username=YOUR_USERNAME \ -Djib.to.auth.password=YOUR_PASSWORD
使ってみた
普段から使っているKotlinでDockerイメージが動かせるということなので、少し欲しかった機能を作りました。
弊社ではGitLabをホスティングしてます。GitLab CIでDockerが動くので、今回欲しかった機能はそこで動かすことにしました。
放置されてるissueが無いように定期的に呼びかけてくれるやつです。
GitLab CIでScheduling Pipelinesという機能があるのでそちらで上記のDockerイメージを動かします。
- .gitlab-ci.yml
services: - docker:dind job:on-schedule: only: - schedules script: - docker run -i --rm -e DUE_DATE_REMINDER_HOST=$DUE_DATE_REMINDER_HOST -e DUE_DATE_REMINDER_PROJECT_ID=$DUE_DATE_REMINDER_PROJECT_ID -e DUE_DATE_REMINDER_GITLAB_TOKEN=$DUE_DATE_REMINDER_GITLAB_TOKEN -e DUE_DATE_REMINDER_LIMIT=$DUE_DATE_REMINDER_LIMIT -e DUE_DATE_REMINDER_SLACK_WEB_HOOK_URL sakebook/gitlab-issue-reminder
直接Dockerイメージを指定すると、ExecutableなDockerイメージだからか2度動いてしまう問題があったのでDocker in Dockerの構成で動かしました。このあたりはプラグインでDockerイメージを生成するときの設定か、ymlの書き方で解決できそうな気もしています。
動くとこんな感じでお尻を叩いてくれます。
まとめ
ExcecutableなDockerイメージの生成を、ほぼ設定無しでできるのは便利です。JVMでありがちなクラスパス周りとかメイン関数のパスの指定とかも諸々をよしなにしてくれます。
さらにjibの開発は活発なので、今後にも期待できます。issueを上げてもすぐに対応してくれました。 この記事を読んだ人にとって、何かアプリケーション作成の選択肢が増えると幸いです。
参考
Introducing Jib — build Java Docker images better / Google Cloud Platform Blog