Dockerイメージを簡単に作成できるjibの紹介

この記事はJX通信社Advent Calendarの9日目です。

Androidエンジニアのsakebookです。NewsDigestというアプリを開発しています。

普段は業務でKotlinばかり触る自分が紹介するのは「jib」というツールです。

github.com

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の USERNAMEPASSWORD は何らかの方法で渡します。 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が動くので、今回欲しかった機能はそこで動かすことにしました。

github.com

放置されてる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の書き方で解決できそうな気もしています。

動くとこんな感じでお尻を叩いてくれます。

f:id:sakebook:20181208140517p:plain
過ぎてるもののほうが多い

まとめ

ExcecutableなDockerイメージの生成を、ほぼ設定無しでできるのは便利です。JVMでありがちなクラスパス周りとかメイン関数のパスの指定とかも諸々をよしなにしてくれます。

さらにjibの開発は活発なので、今後にも期待できます。issueを上げてもすぐに対応してくれました。 この記事を読んだ人にとって、何かアプリケーション作成の選択肢が増えると幸いです。

参考

Introducing Jib — build Java Docker images better / Google Cloud Platform Blog