ScalaでDockerイメージを作る話は定期的に書いている。しかし今回が一番簡単です。
まじで何回書いてんだという話だが、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イメージ化するためのツールキットだ。
jibには以下のような特徴がある:
- Dockerを経由せずに直接イメージを生成する
- Dockerイメージのベストプラクティスといったものに左右されない
- Dockerデーモンがなくても良い
- 比較的?イメージも小さくまとまる
- イメージ生成が高速
- 変更に対してイメージの差分も小さい
sbt-jib
そんなjibをsbt上から簡単に利用できるプラグインがsbt-jib
だ。
このプラグインを利用すると、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するには、jibRegistry
をghcr.io/namespace
などのように設定した後、docker login レジストリ
し、docker push イメージ
するだけでよい。まあこのへんは普通。