sbt-native-packager のベースイメージに amazoncorretto を指定して脆弱性を解決する

3 min読了の目安(約3400字TECH技術記事

sbt-native-packager は sbt の docker plugin です。こちらの記事ではベースイメージに amazoncorretto を指定する方法を解説します。

デフォルトのベースイメージ

sbt-native-packager のデフォルトのベースイメージは openjdk です。sbt docker:publishlocal[1] の実行時に作成される Dockerfile は下記の通り openjdk:8 がベースになっています。

target/docker/stage/Dockerfile
FROM openjdk:8 as stage0
LABEL snp-multi-stage="intermediate"
LABEL snp-multi-stage-id="8687b11c-7c87-4353-a395-44203cd4de23"
WORKDIR /opt/docker
COPY 1/opt /1/opt
COPY 2/opt /2/opt
USER root
RUN ["chmod", "-R", "u=rX,g=rX", "/1/opt/docker"]
RUN ["chmod", "-R", "u=rX,g=rX", "/2/opt/docker"]
RUN ["chmod", "u+x,g+x", "/1/opt/docker/bin/main"]

FROM openjdk:8 as mainstage
USER root
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 ))
WORKDIR /opt/docker
COPY --from=stage0 --chown=demiourgos728:root /1/opt/docker /opt/docker
COPY --from=stage0 --chown=demiourgos728:root /2/opt/docker /opt/docker
USER 1001:0
ENTRYPOINT ["/opt/docker/bin/main"]
CMD []

この Docker Image を ECR に PUSH[2]してスキャンしてみると脆弱性を含んでいることが確認できます。

amazoncorretto を使う

では、ベースイメージに amazoncorretto を指定して脆弱性を解決していきましょう。

ベースイメージを指定

build.sbt で dockerBaseImage[3]amazoncorretto:11-alpine-jdk を指定します。

build.sbt
val main = (project in file("main"))
  .settings(commonSettings)
  .settings(
    name := "main",
    dockerBaseImage := "amazoncorretto:11-alpine-jdk"
  )
  .enablePlugins(DockerPlugin)

sbt docker:publishLocal で作成される Dockerfile を確認するとベースイメージが変更されていることが確認できます。

target/docker/stage/Dockerfile
FROM amazoncorretto:11-alpine-jdk as stage0
LABEL snp-multi-stage="intermediate"
LABEL snp-multi-stage-id="a53b83a6-f6c8-4add-a5d1-9a04110d2d1d"
WORKDIR /opt/docker
COPY 1/opt /1/opt
COPY 2/opt /2/opt
USER root
RUN ["chmod", "-R", "u=rX,g=rX", "/1/opt/docker"]
RUN ["chmod", "-R", "u=rX,g=rX", "/2/opt/docker"]
RUN ["chmod", "u+x,g+x", "/1/opt/docker/bin/main"]

FROM amazoncorretto:11-alpine-jdk as mainstage
USER root
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 ))
WORKDIR /opt/docker
COPY --from=stage0 --chown=demiourgos728:root /1/opt/docker /opt/docker
COPY --from=stage0 --chown=demiourgos728:root /2/opt/docker /opt/docker
USER 1001:0
ENTRYPOINT ["/opt/docker/bin/main"]
CMD []

変更後の確認

同様に、ECRに上げてスキャンしてみると下記の通り脆弱性が解決されていることが確認できます。副次的にコンテナのサイズも軽量化されているので一石二鳥ですね。

これで安心して開発に集中できるようになりました。

おわり

脚注
  1. https://sbt-native-packager.readthedocs.io/en/latest/formats/docker.html#build ↩︎

  2. https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html ↩︎

  3. https://sbt-native-packager.readthedocs.io/en/latest/formats/docker.html#environment-settings ↩︎