ブログ書くだけなのもあれだなと思って、こんな感じにしたらどうかな?ってIssueを書いた。
そしたら「1.1.0でnative image化が十分シンプルになったから、ビルド用のシェルスクリプトを削除したんだ」って教えてもらった。まぁ、確かにそうね。
なので、普通にビルドするってことでいいし、Dockerでやりたい場合でも、僕がこのブログ記事で書いてるようなので良さそう。かな。
それと、マルチステージビルドをしっかりやってるサンプルも教えてもらった。ふむふむー。
追記はここまでです!
MicronautにはGraalVMのサポートが入っていて、GraalVMを使ってMicronautアプリのNative Imageを生成することができる。
ドキュメントはこの辺:https://docs.micronaut.io/1.1.0/guide/index.html#graal
Micronautのバージョンは1.1.0。
Micronautのcreate-appをするときに、graal-native-imageをfeatureオプションにつける。
❯ mn create-app hello-graal--features graal-native-image| Generating Java project...| Application created at /home/bufferings/workspace/micronaut/hello-graal
と、プロジェクトの生成と同時に、GraalVMでNative Imageをビルドするときのためのファイルがいくつか生成される。
その作成されるファイルの中にDockerfileとdocker-build.shがあって「docker-build.shを実行すればDockerのマルチステージビルドで、Native Imageがビルドされるよ!」ってドキュメントには書いてある。
んだけど、いまいちかなー。と思ったのでメモを書いとく。
は、こうなってる
#!/bin/shdocker build .-t hello-graalechoechoecho"To run the docker container execute:"echo" $ docker run --network host hello-graal"
つまり、Dockerfileでビルドしてるよってだけね。じゃあDockerfileを見てみよう。
こうなってる。マルチステージビルドを使ってる。
FROM oracle/graalvm-ce:1.0.0-rc15 as graalvmCOPY . /home/app/hello-graalWORKDIR /home/app/hello-graalRUN native-image --no-server -cp build/libs/hello-graal-*.jarFROM frolvlad/alpine-glibcEXPOSE 8080COPY --from=graalvm /home/app/hello-graal .ENTRYPOINT ["./hello-graal"]
/home/app/hello-graal
にコピーしてnative-image
コマンドを実行してNative Imageをビルドしてるんー。これだと、GradleによるJARファイルのビルドを事前に実行しておかないといけない・・・よね。もしDockerだけで完結させたいならこうかな?
RUN ./gradlew assemble \ && native-image --no-server -cp build/libs/hello-graal-*.jar
ただ、これだとビルドのたびにGradleをダウンロードしてきてビルドするから時間がかかるよね。
この部分だけ
COPY --from=graalvm /home/app/hello-graal .
これ、前半でビルドしたイメージから、必要なファイルをコピーしてきてるんだけど、ソースコードまで要らんくない?しかもルートディレクトリーにガッと突っ込んでる。そうじゃなくて、
COPY --from=graalvm /home/app/hello-graal/hello-graal .
Native Imageだけ取ってこれたらいいかなと。あと、これは僕の好みだけなんだけど、ルート直下に置くよりは、なんかディレクトリーいっこ切っておきたいな。
FROM frolvlad/alpine-glibcEXPOSE 8080WORKDIR /appCOPY --from=graalvm /home/app/hello-graal/hello-graal .ENTRYPOINT ["/app/hello-graal"]
こうなった
FROM oracle/graalvm-ce:1.0.0-rc15 as graalvmCOPY . /home/app/hello-graalWORKDIR /home/app/hello-graalRUN ./gradlew assemble \ && native-image --no-server -cp build/libs/hello-graal-*.jarFROM frolvlad/alpine-glibcEXPOSE 8080WORKDIR /appCOPY --from=graalvm /home/app/hello-graal/hello-graal .ENTRYPOINT ["/app/hello-graal"]
host networkモードを使うんだ!ってドキュメントに書いてある。
$ docker run --network=host hello-world
僕のマシンはUbuntuだからいいんだけど、Docker forMacだと現時点ではサポートされてないよね。。。
https://docs.docker.com/network/host/
素直にpublishオプションを使っていいんじゃないかな。
$ docker run -p 8080:8080 hello-world
いいかなと思う。さっきも書いたけどDocker使うとgradlewの実行遅いし。だから、素直にホストマシンにsdkmanでGraalVM使ってやるといいのかなと。思うのであった。
❯ sdk use java 1.0.0-rc-15-grlUsing java version 1.0.0-rc-15-grlin this shell.❯ ./gradlew assembleStarting a Gradle Daemon,2 incompatible Daemons could not be reused, use--statusfor detailsBUILD SUCCESSFULin 11s10 actionable tasks:7 executed,3 up-to-date<------------->0% WAITING> IDLE❯ native-image--no-server-cp build/libs/hello-graal-*.jar[hello-graal:31214] classlist:6,843.33 ms[hello-graal:31214](cap):1,346.60 ms[hello-graal:31214] setup:3,216.68 ms[hello-graal:31214](typeflow):52,258.57 ms[hello-graal:31214](objects):38,803.47 ms[hello-graal:31214](features):2,844.33 ms[hello-graal:31214] analysis:97,553.99 ms[hello-graal:31214] universe:2,264.42 ms[hello-graal:31214](parse):7,780.03 ms[hello-graal:31214](inline):10,103.81 ms[hello-graal:31214](compile):85,401.85 ms[hello-graal:31214] compile:106,246.90 ms[hello-graal:31214] image:5,274.68 ms[hello-graal:31214] write:1,565.77 ms[hello-graal:31214][total]:223,483.88 ms❯ ./hello-graal23:31:52.391[main] INFO io.micronaut.runtime.Micronaut - Startup completedin 169ms. Server Running: http://localhost:8080^C❯ ./hello-graal23:32:00.775[main] INFO io.micronaut.runtime.Micronaut - Startup completedin 64ms. Server Running: http://localhost:8080
お。何も設定してないから速いってのもあるけど200msとか100msとかで起動するのは良いなー。
ということで、もうちょっとMicronautとGraalVMのNative Image周りを勉強してみようと思う。
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。