案外まとまった手順がネットになかったので放流しておきます。
どういうときに読むか
sbt-native-packager
でDockerイメージを作成しようとしたら
/bin/sh: adduser: command not found
と表示されたとき
sbt-native-packager
とは
ScalaをDockerやdebパッケージなどのプラットフォーム固有の形式にパッケージングするためのsbtプラグイン。
Dockerイメージを作ることもできるので、サーバをDocker化するのによく使います。
build.properties
sbtのバージョンは執筆時点で最新のものです。
sbt.version=1.10.2
project/plugins.sbt
プラグインも執筆時点で最新のものです。
addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "1.10.4")
build.sbt
Scalaバージョンも執筆時点で最新のものです。
val scala3Version = "3.5.1" enablePlugins(JavaAppPackaging) enablePlugins(DockerPlugin) lazy val root = project .in(file(".")) .settings( name := "hogehoge", version := "0.1.0-SNAPSHOT", scalaVersion := scala3Version, libraryDependencies ++= Seq( // ... ), dockerBaseImage := "amazoncorretto:21", Docker / daemonUserUid := None, Docker / daemonUser := "daemon", dockerExposedPorts ++= Seq(8080) // なんかポートを開けたい場合 )
特に以下の箇所がミソです:
dockerBaseImage := "amazoncorretto:21", Docker / daemonUserUid := None, Docker / daemonUser := "daemon",
dockerBaseImage
がJVMが乗ったベースイメージを指定する設定です。今回はCorretto 21を利用しています。
ただ問題が起こることもあります。ユーザを追加するコマンドがLinuxディストリビューションで異なるためです。sbt-native-packager
はコンテナ内でユーザを作成してそのユーザでJVMを起動させようとするのですがそこで影響が出るというわけ。
Correttoもその例に漏れず、build時に問題が起こるのですがdaemonUserUid
をNone
にすることで問題が起こる箇所をうまく回避できます。しかしデーモンとなるユーザは欲しいのでdemonUser
は指定します。
なんでこんなことになるかというと、CorrettoはAmazon Linuxをベースイメージに構築されており、adduser
コマンドなどが同梱されていないため。Alpine版のCorrettoを使ってもいいのですが、すると今度はbashが無くて困るという苦しみをあじわうことになります。
いくらなんでもガバガバすぎるのでコントリビュートしたい気持ちになってきた・・・