Slide 1

Slide 1 text

Alpine Linux対応のJava16で 最小Docker Imageをつくる 2021/3/12 nakanoshima.dev#14 JVM Langs Night Talk LINE Fukuoka きしだ なおき

Slide 2

Slide 2 text

自己紹介 • きしだ なおき • LINE Fukuoka • Developer Relations • Javaサーバサイド • twitter: @kis

Slide 3

Slide 3 text

Java 16 • 3/16リリース

Slide 4

Slide 4 text

Alpine Linux • musl • c標準ライブラリ • glibc互換 • コンパクトに整理されている • ヘッダが人間にも読める • glibcは#ifdefたくさんで読みにくい • busybox • すべてのコマンドがbusyboxにsymbolic link • apk • パッケージ管理

Slide 5

Slide 5 text

Portolaプロジェクト • JDKをAlpine Linuxに対応する • メンバー • Mikaelさん • BellSoftの人 • 他

Slide 6

Slide 6 text

対応ディストリビューション • Zulu • Liberica JDK

Slide 7

Slide 7 text

Zulu • Azul Systems https://www.azul.com/downloads/zulu-community/?version=java-15-mts&os=alpine-linux&package=jdk

Slide 8

Slide 8 text

Liberica JDK • BellSoft https://bell-sw.com/pages/downloads/#/java-15-current

Slide 9

Slide 9 text

Liberica JDK • docker image https://hub.docker.com/r/bellsoft/liberica-openjdk-alpine-musl

Slide 10

Slide 10 text

16で正式対応 • JEP 386: Alpine Linux Port https://openjdk.java.net/jeps/386

Slide 11

Slide 11 text

16にはまだAlpineバイナリがない・・・ • JDK 16 RC http://jdk.java.net/16/

Slide 12

Slide 12 text

では自分でビルドだ • bash configure make • ソースはGitHub https://github.com/openjdk/jdk/tree/jdk-16+36

Slide 13

Slide 13 text

ビルドエラー (T^T) • allocaの戻り値を使っていないという警告が

Slide 14

Slide 14 text

パッチ • ダミー変数に割り当てる 672c672 < alloca(((pid ^ counter++) & 7) * 128); --- > int* dummy = (int*)alloca(((pid ^ counter++) & 7) * 128);

Slide 15

Slide 15 text

結構大きい • 961MB

Slide 16

Slide 16 text

jlinkで実行環境を最適化 • 必要なモジュールだけを持つJava実行環境をつくる • jdepsで必要なモジュールを確認する • Springのようなfat-jarでは一度展開してライブラリjarを取り出して おく必要がある > jlink --compress 2 --strip-debug --no-header-files --no-man-pages --output /src/jre --add-modules java.base,java.desktop,java.instrument,java.management.rmi,java.naming,java.pref s,java.scripting,java.security.jgss,java.sql,jdk.httpserver,jdk.jfr,jdk.unsuppor ted

Slide 17

Slide 17 text

77MB • 77MBのイメージができた

Slide 18

Slide 18 text

参考 • UbuntuやJibを使ってみる

Slide 19

Slide 19 text

Jib • Googleが開発したDockerイメージ作成ツール • Docker不要 • Mavenなどに組み込んで使う • mvn jib:dockerBuild org.springframework.boot spring-boot-maven-plugin com.google.cloud.tools jib-maven-plugin 2.7.0 spring-jib

Slide 20

Slide 20 text

Shenandoahとかいらなくない? • 使わない機能がたくさんある • Javaには6つのGCがある • 1つしか使わない • 削ってみる

Slide 21

Slide 21 text

--disable-jvm-feature • 使わないものを無効にしてみる bash configure --disable-jvm-feature-aot --disable-jvm-feature-graal --disable- jvm-feature-parallelgc --disable-jvm-feature-shenandoahgc --disable-jvm-feature- zgc --disable-jvm-feature-epsilongc --disable-jvm-feature-jvmci --disable-jvm- feature-jni-check --disable-jvm-feature-dtrace

Slide 22

Slide 22 text

結果:そんな小さくない • 74MB

Slide 23

Slide 23 text

もっと削ってみる • JITいらんくない? • Serial GCでよくない? • 管理しねーし bash configure --disable-jvm-feature-aot --disable-jvm-feature-graal -- disable-jvm-feature-parallelgc --disable-jvm-feature-shenandoahgc -- disable-jvm-feature-zgc --disable-jvm-feature-epsilongc --disable-jvm- feature-jvmci --disable-jvm-feature-jni-check --disable-jvm-feature-dtrace --disable-jvm-feature-cds --disable-jvm-feature-compiler1 --disable-jvm- feature-compiler2 --disable-jvm-feature-jvmti --disable-jvm-feature-jfr -- disable-jvm-feature-management --disable-jvm-feature-g1gc --disable-jvm- feature-services --disable-jvm-feature-nmt --disable-jvm-feature-vm-structs --disable-jvm-feature-link-time-opt

Slide 24

Slide 24 text

60MB! • だいぶ小さくなった

Slide 25

Slide 25 text

うごいた! • 動きます • でも遅い

Slide 26

Slide 26 text

まとめ • Java16でAlpine Linuxに対応 • ちいさいDocker Imageが作れる • いろんなディストリビューションが対応するかも