sbt-native-packagerでdockerイメージのベースをamazoncorrettoにしたい

build.sbtに以下を追加します。

```
dockerBaseImage := "amazoncorretto:{VERSION}"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16913/9b1c3906-2eda-986f-849e-4c4dfc8e624b.png)

ところが

```
sbt "docker:publishLocal"
```

でビルドしようとすると

```
[error] java.lang.RuntimeException: Nonzero exit value: 127
[error] 	at com.typesafe.sbt.packager.docker.DockerPlugin$.publishLocalDocker(DockerPlugin.scala:564)
[error] 	at com.typesafe.sbt.packager.docker.DockerPlugin$.$anonfun$projectSettings$37(DockerPlugin.scala:209)
[error] 	at com.typesafe.sbt.packager.docker.DockerPlugin$.$anonfun$projectSettings$37$adapted(DockerPlugin.scala:201)
[error] 	at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error] 	at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:40)
[error] 	at sbt.std.Transform$$anon$4.work(System.scala:67)
[error] 	at sbt.Execute.$anonfun$submit$2(Execute.scala:269)
[error] 	at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error] 	at sbt.Execute.work(Execute.scala:278)
[error] 	at sbt.Execute.$anonfun$submit$1(Execute.scala:269)
[error] 	at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[error] 	at sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[error] 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] 	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error] 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error] 	at java.lang.Thread.run(Thread.java:748)
[error] (Docker / publishLocal) Nonzero exit value: 127
[error] Total time: 77 s, completed 2020/02/22 11:21:07
```

といったエラーが出て失敗してしまいます :innocent: 
生成されたDockerfileを覗いてみると

```
RUN id -u demiourgos728 1>/dev/null 2>&1 || (( getent group 0 1>/dev/null 2>&1 || ( type groupadd 1>/dev/null 2>&1 && groupadd -g 0 root || addgroup -g 0 -S root )) && ( type useradd 1>/dev/null 2>&1 && useradd --system --create-home --uid 1001 --gid 0 demiourgos728 || adduser -S -u 1001 -G root demiourgos728 ))
```

といった行があります。
[amazoncorrettoはamazonlinuxをベース](https://github.com/corretto/corretto-11-docker/blob/a797c24219a9262e581ee70fc928c57acacde331/Dockerfile#L1)にしていますが、amazonlinuxでは`addgroup`や`adduser`が使えないため([参考1](https://tutorialmore.com/questions-2080654.htm)、[参考2](https://www.bunkei-programmer.net/entry/2017/10/24/023746#%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%83%A6%E3%83%BC%E3%82%B6%E8%BF%BD%E5%8A%A0%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%82%93%E3%81%A7%E3%81%99%E3%81%91%E3%81%A9))エラーが発生していると考えられます。

参考先にもある通り、

```
RUN yum install -y shadow-utils
```

を挟んであげる事で回避できますが、そもそも動かすだけならシンプルな設定でも十分なのでDockerfileをスクラッチで書き直してしまいましょう。
https://www.scala-sbt.org/sbt-native-packager/formats/docker.html#write-from-scratch

```
import com.typesafe.sbt.packager.docker._

dockerCommands := Seq(
  Cmd("FROM", "amazoncorretto:{VERSION}"),
  Cmd("COPY", "opt", "/opt"),
  ExecCmd("ENTRYPOINT", "/opt/docker/bin/{APP_NAME}")
)
```

生成されるDockerfileを確認するためには以下のコマンドが使えます。

```
sbt "show dockerCommands"
```

```
[info] * Cmd(FROM,WrappedArray(amazoncorretto:{VERSION}))
[info] * Cmd(COPY,WrappedArray(opt, /opt))
[info] * ExecCmd(ENTRYPOINT,WrappedArray(/opt/docker/bin/{APP_NAME}))
```

最低限の内容になっている事が確認できます。
ビルドも無事成功します。