Lambdaカクテル

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

Invite link for Scalaわいわいランド

sbt-native-packagerでCorrettoを利用するにはdaemonUserUidをいじるといい

案外まとまった手順がネットになかったので放流しておきます。

どういうときに読むか

sbt-native-packagerでDockerイメージを作成しようとしたら

/bin/sh: adduser: command not found

と表示されたとき

sbt-native-packagerとは

ScalaをDockerやdebパッケージなどのプラットフォーム固有の形式にパッケージングするためのsbtプラグイン。

blog.3qe.us

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時に問題が起こるのですがdaemonUserUidNoneにすることで問題が起こる箇所をうまく回避できます。しかしデーモンとなるユーザは欲しいのでdemonUserは指定します。

なんでこんなことになるかというと、CorrettoはAmazon Linuxをベースイメージに構築されており、adduserコマンドなどが同梱されていないため。Alpine版のCorrettoを使ってもいいのですが、すると今度はbashが無くて困るという苦しみをあじわうことになります。

いくらなんでもガバガバすぎるのでコントリビュートしたい気持ちになってきた・・・

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