Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
20250613-SSKMvol.15
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
diostray
June 16, 2025
Programming
310
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
20250613-SSKMvol.15
diostray
June 16, 2025
More Decks by diostray
See All by diostray
20220210-kotlin-serverside-meetup
diostray
0
390
20210518_shikujiri_justincase
diostray
0
290
20191219-react-lightning-talk
diostray
0
290
Other Decks in Programming
See All in Programming
Oxcを導入して開発体験が向上した話
yug1224
4
290
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
340
CSC307 Lecture 17
javiergs
PRO
0
320
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
160
These Five Tricks Can Make Your Apps Greener, Cheaper, & Nicer
hollycummins
0
280
Vite+ Unified Toolchain for the Web
naokihaba
0
130
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
3
120
AIとRubyの静的型付け
ukin0k0
0
550
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
1
630
AI時代のUIはどこへ行く?その2!
yusukebe
19
6.9k
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
310
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
120
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
200
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
WCS-LA-2024
lcolladotor
0
620
How STYLIGHT went responsive
nonsquared
100
6.2k
The Invisible Side of Design
smashingmag
302
52k
KATA
mclloyd
PRO
35
15k
30 Presentation Tips
portentint
PRO
1
320
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Color Theory Basics | Prateek | Gurzu
gurzu
0
360
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Transcript
Buildpacks について ServerSide Kotlin Meetup vol.15 2025/6/13 株式会社 justInCaseTechnologies 1
2 はじめに
3 自己紹介: 小佐野 洋 (OSANO, Hiroshi) Full Stack Engineer (自称)
• Androidアプリ → Webフロント → バックエンドのテックリード → 技術責任者 • インフラ構築〜バックエンド〜Webフロント / モバイルアプリ ちょっとわかる ◦ バックエンドが一番長いし、得意 長いことやってきたのは Java / JavaScript • Kotlinはいいぞ (大声) • Android Jetpackもいいぞ • TypeScript もいいぞ • C#はいいぞ (小声)
4 会社紹介: justInCaseTechnologies Tech Stacks Web frontend Backend ▪ React
▪ TypeScript ▪ Vercel (Next.js) Infrastructure ▪ Kotlin ▪ Spring Framework ▪ Python (ごく一部) ▪ AWS ▪ ECS (fargate) ▪ CDK ▪ Datadog 助けられ、助ける喜びを、すべての人へ。
5 会社紹介: justInCaseTechnologies Tech Stacks Web frontend Backend ▪ React
▪ TypeScript ▪ Vercel (Next.js) Infrastructure ▪ Kotlin ▪ Spring Framework ▪ Python (ごく一部) ▪ AWS ▪ ECS (fargate) ▪ CDK ▪ Datadog 助けられ、助ける喜びを、すべての人へ。
6 そういえば 2025年の KotlinConf で戦略的提携パートナーシップのニュースが出ましたね!
7 コンテナ化、めんどくさくないですか?
• アプリケーションビルドのツールチェーン (gradle) やコマンドとうまく組み合わせないといけない ◦ jar 化の単位 (uber jar) は?ライブラリはどういれる?
◦ ビルドするところは Dockerfile の中? • Dockerfile 自体のメンテナンスが必要 ◦ ベースイメージってなんだっけ?何が入ってる? ▪ たまーーーーーにベースイメージが変わってひどい目にあった ◦ マルチステージビルド用の記述がまぁめんどくさい ▪ docker の layer に何を含める?それがどうキャッシュされる? 8 コンテナ化、結構めんどくさい (個人の感想です)
• アプリケーションビルドのツールチェーン (gradle) やコマンドとうまく組み合わせないといけない ◦ jar 化の単位 (uber jar) は?ライブラリはどういれる?
◦ ビルドするところは Dockerfile の中? • Dockerfile 自体のメンテナンスが必要 ◦ ベースイメージってなんだっけ?何が入ってる? ▪ たまーーーーーにベースイメージが変わってひどい目にあった ◦ マルチステージビルド用の記述がまぁめんどくさい ▪ docker の layer に何を含める?それがどうキャッシュされる? 9 コンテナ化、結構めんどくさい (個人の感想です) アプリケーションを作るようにイメージも作りたい!!!!! それ、あるよ (buildpacks)
10 はじめに〜今日話すこと SpringBoot アプリケーションの docker イメージの作成は gradle コマンドが提供されています その gradle
コマンドの中身を深掘りしていくのが目的です Docker イメージ作成のログ (例) === [Container] 2025/06/07 10:06:15.182670 Running command ./gradlew :console:bootBuildImage --imageName=joinsure-policy-console:$IMAGE_TAG --runImage=$CUSTOM_RUN_REPOSITORY_URI:$CUSTOM_RUN_IMAGE_TAG --builder=$CUSTOM_RUN_REPOSITORY_URI:$CUSTOM_BUILDER_IMAGE_TAG Starting a Gradle Daemon (subsequent builds will be faster) > Task :console:checkKotlinGradlePluginConfigurationErrors > Task :console:compileJava NO-SOURCE > Task :console:classes > Task :console:resolveMainClassName > Task :console:bootJar > Task :console:bootBuildImage Building image 'docker.io/library/joinsure-policy-console:a6e843847c73565f2b4737d13442cb00361cfa80-1749290775' 〜中略〜 Successfully built image 'docker.io/library/joinsure-policy-console:a6e843847c73565f2b4737d13442cb00361cfa80-1749290775' BUILD SUCCESSFUL in 2m 58s 13 actionable tasks: 12 executed, 1 from cache
11 はじめに〜今日話すこと Docker イメージ作成のログ (例) === [Container] 2025/06/07 10:06:15.182670 Running
command ./gradlew :console:bootBuildImage --imageName=joinsure-policy-console:$IMAGE_TAG --runImage=$CUSTOM_RUN_REPOSITORY_URI:$CUSTOM_RUN_IMAGE_TAG --builder=$CUSTOM_RUN_REPOSITORY_URI:$CUSTOM_BUILDER_IMAGE_TAG Starting a Gradle Daemon (subsequent builds will be faster) > Task :console:checkKotlinGradlePluginConfigurationErrors > Task :console:compileJava NO-SOURCE > Task :console:classes > Task :console:resolveMainClassName > Task :console:bootJar > Task :console:bootBuildImage Building image 'docker.io/library/joinsure-policy-console:a6e843847c73565f2b4737d13442cb00361cfa80-1749290775' 〜中略〜 Successfully built image 'docker.io/library/joinsure-policy-console:a6e843847c73565f2b4737d13442cb00361cfa80-1749290775' BUILD SUCCESSFUL in 2m 58s 13 actionable tasks: 12 executed, 1 from cache これが docker イメージを作成する gradle コマンド (引数は後で説明します) SpringBoot アプリケーションの docker イメージの作成は gradle コマンドが提供されています その gradle コマンドの中身を深掘りしていくのが目的です
12 はじめに〜今日話すこと Docker イメージ作成のログ (例) === [Container] 2025/06/07 10:06:15.182670 Running
command ./gradlew :console:bootBuildImage --imageName=joinsure-policy-console:$IMAGE_TAG --runImage=$CUSTOM_RUN_REPOSITORY_URI:$CUSTOM_RUN_IMAGE_TAG --builder=$CUSTOM_RUN_REPOSITORY_URI:$CUSTOM_BUILDER_IMAGE_TAG Starting a Gradle Daemon (subsequent builds will be faster) > Task :console:checkKotlinGradlePluginConfigurationErrors > Task :console:compileJava NO-SOURCE > Task :console:classes > Task :console:resolveMainClassName > Task :console:bootJar > Task :console:bootBuildImage Building image 'docker.io/library/joinsure-policy-console:a6e843847c73565f2b4737d13442cb00361cfa80-1749290775' 〜中略〜 Successfully built image 'docker.io/library/joinsure-policy-console:a6e843847c73565f2b4737d13442cb00361cfa80-1749290775' BUILD SUCCESSFUL in 2m 58s 13 actionable tasks: 12 executed, 1 from cache これが docker イメージを作成する gradle コマンド (引数は後で説明します) 中略部分も後で説明します SpringBoot アプリケーションの docker イメージの作成は gradle コマンドが提供されています その gradle コマンドの中身を深掘りしていくのが目的です
13 はじめに〜今日話すこと gradle のコマンド「bootBuildImage」は gradle のプラグイン「org.springframework.boot (*1)」が提供しているコマンド (*2) です このコマンドは内部で
CloudNative Buildpacks という技術を用いて docker イメージを作成しています 重要なポイントは Dockerfile が GitHub リポジトリにも、 docker イメージをビルドするところにも存在しない点です この機能を提供しているのが CloudNative Buildpacks です 「Dockerfile をプログラムで生成している」と言い換えてもいいです *1: https://plugins.gradle.org/plugin/org.springframework.boot *2: https://spring.pleiades.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#build-image
14 (CloudNative) Buildpacks とは
15 CloudNative Buildpacks とは 〜歴史編 画像は https://buildpacks.io/ より引用
16 CloudNative Buildpacks とは 〜歴史編 画像は https://buildpacks.io/ より引用 2011年に Heroku
が開発 Heroku = PaaS ベンダ ここでの名前が buildpacks だった https://jp.heroku.com/elements/buildpacks
17 CloudNative Buildpacks とは 〜歴史編 画像は https://buildpacks.io/ より引用 Pivotal が
Heroku 用の buildpacks を Heroku 以外の PaaS 用に開発 Pivotal = PaaS ベンダ (Cloud Foundry)
18 CloudNative Buildpacks とは 〜歴史編 画像は https://buildpacks.io/ より引用 2018年にPivotal と
Heroku が buildpacks を Cloud Native Computing Foundation (CNCF) に寄贈 CNCF = Kubernetes 等を保有する開発組織
19 CloudNative Buildpacks とは 〜機能編 CloudNative Buildpacks を理解する上で重要なキーワード builder buildpack
20 CloudNative Buildpacks とは 〜builderとは? コンテナ化をするためのコンテナイメージ [重要] アプリケーションのベースイメージではない = Dockerfile
の “FROM” に指定するコンテナではないです [重要] ざっくり言うとアプリケーションイメージを作るためのイメージです。この中にアプリケーションをビルドしたりする時 に必要なパッケージとかを入れます。 Docker イメージ作成のログ (例) === [Container] 2025/06/07 10:06:15.182670 Running command ./gradlew :console:bootBuildImage --imageName=joinsure-policy-console:$IMAGE_TAG --runImage=$CUSTOM_RUN_REPOSITORY_URI:$CUSTOM_RUN_IMAGE_TAG --builder=$CUSTOM_RUN_REPOSITORY_URI:$CUSTOM_BUILDER_IMAGE_TAG Starting a Gradle Daemon (subsequent builds will be faster) > Task :console:checkKotlinGradlePluginConfigurationErrors > Task :console:compileJava NO-SOURCE > Task :console:classes > Task :console:resolveMainClassName > Task :console:bootJar > Task :console:bootBuildImage Building image 'docker.io/library/joinsure-policy-console:a6e843847c73565f2b4737d13442cb00361cfa80-1749290775' 〜中略〜 Successfully built image 'docker.io/library/joinsure-policy-console:a6e843847c73565f2b4737d13442cb00361cfa80-1749290775' BUILD SUCCESSFUL in 2m 58s 13 actionable tasks: 12 executed, 1 from cache builder を指定する引数
21 CloudNative Buildpacks とは 〜builderとは? Docker イメージ作成のログ (例) === [Container]
2025/06/07 10:06:15.182670 Running command ./gradlew :console:bootBuildImage --imageName=joinsure-policy-console:$IMAGE_TAG --runImage=$CUSTOM_RUN_REPOSITORY_URI:$CUSTOM_RUN_IMAGE_TAG --builder=$CUSTOM_RUN_REPOSITORY_URI:$CUSTOM_BUILDER_IMAGE_TAG Starting a Gradle Daemon (subsequent builds will be faster) > Task :console:checkKotlinGradlePluginConfigurationErrors > Task :console:compileJava NO-SOURCE > Task :console:classes > Task :console:resolveMainClassName > Task :console:bootJar > Task :console:bootBuildImage Building image 'docker.io/library/joinsure-policy-console:a6e843847c73565f2b4737d13442cb00361cfa80-1749290775' 〜中略〜 Successfully built image 'docker.io/library/joinsure-policy-console:a6e843847c73565f2b4737d13442cb00361cfa80-1749290775' BUILD SUCCESSFUL in 2m 58s 13 actionable tasks: 12 executed, 1 from cache こっちがアプリケーションのベース イメージを指定する引数 コンテナ化をするためのコンテナイメージ [重要] アプリケーションのベースイメージではない = Dockerfile の “FROM” に指定するコンテナではないです [重要] ざっくり言うとアプリケーションイメージを作るためのイメージです。この中にアプリケーションをビルドしたりする時 に必要なパッケージとかを入れます。
22 CloudNative Buildpacks とは 〜buildpackとは? Docker イメージ作成のログ (例) === >
Task :console:bootBuildImage Building image 'docker.io/library/joinsure-policy-console:a6e843847c73565f2b4737d13442cb00361cfa80-1749290775' 〜中略〜 > Running detector [detector] target distro name/version labels not found, reading /etc/os-release file [detector] 6 of 26 buildpacks participating [detector] paketo-buildpacks/ca-certificates 3.9.1 [detector] paketo-buildpacks/bellsoft-liberica 11.0.5 [detector] paketo-buildpacks/syft 2.8.0 [detector] paketo-buildpacks/executable-jar 6.12.1 [detector] paketo-buildpacks/dist-zip 5.9.1 [detector] paketo-buildpacks/spring-boot 5.32.1 > Running restorer > Running builder [builder] target distro name/version labels not found, reading /etc/os-release file 〜後略〜 アプリケーションイメージを作る時 に追加する buildpack を検出してい るところ アプリケーションイメージを作る時に組み込むもの ざっくり言うとコンテナイメージの Layer を作るものをパッケージしたもの
Docker イメージ作成のログ (例) === > Running builder [builder] target distro
name/version labels not found, reading /etc/os-release file [builder] [builder] Paketo Buildpack for CA Certificates 3.9.1 〜略〜 [builder] [builder] Paketo Buildpack for BellSoft Liberica 11.0.5 〜略〜 [builder] [builder] Paketo Buildpack for Syft 2.8.0 〜略〜 [builder] [builder] Paketo Buildpack for Executable JAR 6.12.1 〜略〜 [builder] [builder] Paketo Buildpack for Spring Boot 5.32.1 〜略〜 > Running exporter [exporter] Adding layer 'paketo-buildpacks/ca-certificates:helper' 〜後略〜 23 CloudNative Buildpacks とは 〜buildpackとは? アプリケーションイメージを作る時に組み込むもの ざっくり言うとコンテナイメージの Layer と、 Layer を作るためのもの アプリケーションイメージを作る時 にそれぞれの buildpack が反応して いるところ buildpack ごとにやることが違う 環境変数を変更したり、環境変数に よって Layer の中身を変えたりする それぞれの buildpack が作成した layer を合成してアプリケーションイ メージにしているところ
24 Buildpacks 実装編
25 ターミナルから実行できる “pack” という cli が提供されています (Go 製) Google Cloud
Platform はこっちを使っている模様 • https://github.com/buildpacks/pack/ 参考)buildpack 実装編
26 SpringBoot の gradle プラグインはこのあたりに実装されてます “pack” cli を利用しておらず、独自実装しています • https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-tools/spring-boot
-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/JavaPluginAction.java#L191 ◦ war の場合は別ファイル • https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-tools/spring-boot -gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/bundling/BootBuildImage.java ◦ “bootBuildImage” コマンドの中身 (主にコマンドライン引数) • https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-tools/spring-boot -buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/build/Builder.java ◦ “bootBuildImage” コマンドの中身 (主にアプリケーションイメージのビルドを実行するところ) 参考)buildpack 実装編