Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Alpine対応のJava16で最小Docker Imageをつくる / Make minimum Docker Image with Java 16 on Alpine

Alpine対応のJava16で最小Docker Imageをつくる / Make minimum Docker Image with Java 16 on Alpine

2021年3月12日に開催されたnakanoshima.dev#14 JVM Langs Night Talkの資料です
https://nakanoshima-dev.connpass.com/event/204733/

Naoki Kishida

March 12, 2021
Tweet

More Decks by Naoki Kishida

Other Decks in Programming

Transcript

  1. Alpine Linux • musl • c標準ライブラリ • glibc互換 • コンパクトに整理されている

    • ヘッダが人間にも読める • glibcは#ifdefたくさんで読みにくい • busybox • すべてのコマンドがbusyboxにsymbolic link • apk • パッケージ管理
  2. パッチ • ダミー変数に割り当てる 672c672 < alloca(((pid ^ counter++) & 7)

    * 128); --- > int* dummy = (int*)alloca(((pid ^ counter++) & 7) * 128);
  3. 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
  4. Jib • Googleが開発したDockerイメージ作成ツール • Docker不要 • Mavenなどに組み込んで使う • mvn jib:dockerBuild

    <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>2.7.0</version> <configuration> <to> <image>spring-jib</image> </to> </configuration> </plugin> </plugins> </build>
  5. --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
  6. もっと削ってみる • 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