Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
340
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
300
Other Decks in Programming
See All in Programming
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
180
AIエージェント時代のコードレビューを設計する
nogu66
6
2.7k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
150
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2k
WebMCP Challenge に星空観察アプリで参加した話
okajun35
0
180
Security issues being discussed on Web Platforms
petamoriken
0
970
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.3k
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
3
350
XHTMLが残したもの
yosuke_furukawa
PRO
2
810
PL/pgSQLはなぜ「ふつうのSQL」より遅いのか
tameguro
0
110
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
490
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
280
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
10k
KATA
mclloyd
PRO
35
15k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
320
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
HDC tutorial
michielstock
2
870
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
700
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
280
We Are The Robots
honzajavorek
0
380
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
330
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
490
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 実装編