Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

sbt-jibでScalaのDockerイメージを簡単に作ろう

ScalaでDockerイメージを作る話は定期的に書いている。しかし今回が一番簡単です。

blog.3qe.us

blog.3qe.us

blog.3qe.us

まじで何回書いてんだという話だが、Dockerコンテナはあまりにも日常の一部になってしまっているので、ScalaでもDockerコンテナが簡単に作れないと困るのだ。

今回はsbt-jibというsbtプラグインを使ってScalaが動くDockerイメージを作成する。

環境

現時点で最新のバージョンを利用しているため、適宜読み替えてほしい:

  • Scala 3.5.2
  • sbt 1.10.6
  • sbt-jib 1.3.7
  • jib-core 0.27.2

jib

jibとは、JavaアプリケーションをDockerイメージ化するためのツールキットだ。

github.com

cloud.google.com

jibには以下のような特徴がある:

  • Dockerを経由せずに直接イメージを生成する
    • Dockerイメージのベストプラクティスといったものに左右されない
    • Dockerデーモンがなくても良い
  • 比較的?イメージも小さくまとまる
  • イメージ生成が高速
  • 変更に対してイメージの差分も小さい

sbt-jib

そんなjibをsbt上から簡単に利用できるプラグインがsbt-jibだ。

github.com

このプラグインを利用すると、jibを自動的に呼び出してアプリケーションをDockerコンテナ化してくれる。

sbt-jibを利用するには、まずproject/plugins.sbtに以下のように記述する:

addSbtPlugin("de.gccc.sbt" % "sbt-jib" % "1.3.7")
libraryDependencies += "com.google.cloud.tools" % "jib-core" % "0.27.2"

libraryDependenciesは普通はbuild.sbtに書くが、今回はproject/plugins.sbtに書くことに注意。

最後に、いくつかの設定をbuild.sbtに書く:

// イメージの日時を作成日時にする
jibUseCurrentTimestamp := true,
// ローカルで使うだけなら空白でよい
jibRegistry := "",
// デフォルトだとorganizationになる
jibOrganization := "windymelt",
// デフォルトだとプロジェクト名になるが、プロジェクト名にスペースが入っていたりすると動かないのでここで指定する
jibName := "sbt-jib-exercise",

たとえば設定例は以下の通り:

// build.sbt
val scala3Version = "3.5.2"

lazy val root = project
  .in(file("."))
  .settings(
    name := "sbt-jib exercise",
    version := "0.1.0-SNAPSHOT",
    scalaVersion := scala3Version,
    jibRegistry := "",
    jibOrganization := "windymelt",
    jibName := "sbt-jib-exercise"
  )

これでsbt jibImageBuildを実行するとwindymelt/sbt-jib-exercise:0.1.0-SNAPSHOTが作られる。jibに直接作らせるのではなくDockerも利用してイメージを作る場合はsbt jibDockerBuildとする。image successfully created & uploadedと表示される。何も指定していなくてもDockerhubにアップされているっぽい?調査する。

他にもポート解放用の設定などがあるのでドキュメントを読んでみることをおすすめする。

リポジトリにpushする

リポジトリにpushするには、jibRegistryghcr.io/namespaceなどのように設定した後、docker login レジストリし、docker push イメージするだけでよい。まあこのへんは普通。

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?