8. Copyright(c)2022 NTT Corp. All Rights Reserved. 8
?1?Dockerの?何(docker build)
l `docker build`のg廾since 18.09
l h廠篳`DOCKER_BUILDKIT=1`を峺協することでBuildKitを嗤浸できる
l dockerd にBuildKitが岷俊y栽されている
dockerd
BuildKit
docker build
Docker API
9. Copyright(c)2022 NTT Corp. All Rights Reserved. 9
?2??Dockerfileビルダ
l `buildkitd`というデ`モンを聞ってDockerfileのビルドが辛嬬gRPC APIを戻工。 buildkitd
のクライアントとして嘛するビルダがある
? Docker Buildx(瘁峰) https://github.com/docker/buildx
? nerdctl: Docker札Qのcontainerd CLI https://github.com/containerd/nerdctl
l buildkitが戻工するライブラリを聞ってbuildkitdをアプリケ`ションに托めzむことも辛嬬
? e.g. img https://github.com/genuinetools/img
? Jess Frazelle (Oxide Computer)が_k。daemonless, rootlessなイメ`ジビルダ
img
buildkitd
docker buildx
gRPC API
nerdctl build
buildctl
gRPC API
BuildKit
CLI
10. Copyright(c)2022 NTT Corp. All Rights Reserved. 10
?3?Kubernetes鬚鰻嵒▲咼襯
l buildkitdをKubernetes貧で蛍柊借Pさせることが辛嬬
l さまざまなデプロイパタ`ンがある
Deployment+Service StatefulSet Job
ランダムロ`ドバランシング。
レジストリを初したキャッ
シュ慌嗤により?堀なビルド
が辛嬬。
クライアント箸任離踪`ドバ
ランシング。consistent hash
を聞えば紳糞弔縫踪`カル
キャッシュを試?辛嬬。
ワンショットなビルドg?。
BuildKitデ`モンの?豚借咾
音勣。ロ`カルキャッシュは
ビルドのたびに茅。
Cluster
BuildKit
buildctl
BuildKit
BuildKit
BuildKit
Service
BuildKit
buildctl
BuildKit
BuildKit BuildKit
buildctl
+
BuildKit
kubectl
Cluster Cluster
https://github.com/moby/buildkit/tree/master/examples/kubernetes
11. Copyright(c)2022 NTT Corp. All Rights Reserved. 11
?4??のビルダ/ランタイムフレ`ムワ`ク
l BuildKitはLLBというビルドの嶄g燕Fをサポ`ト
l Dockerfileのみならず?なビルド?の?Zを協x辛嬬
l ビルドだけでなくテストなどもg?辛嬬なCI/CDフレ`ムワ`クを戻工するプロジェク
トもあるe.g. Earthly, Dagger
BuildKit
Mockerfile Gockerfile HLB
Earthly
bldr
Nix
Cargo
Wharf
mopy envd
Dockerfile Buildpacks
´
Dagger
(cue)
https://github.com/moby/buildkit#exploring-llb
12. Copyright(c)2022 NTT Corp. All Rights Reserved. 12
BuildKitの古勣
1.
?肝
3. BuildKitの嶄?の古勣
4. BuildKit v0.10からのC嬬と
これからのBuildKit
2. BuildKitのさまざまなC嬬
13. Copyright(c)2022 NTT Corp. All Rights Reserved. 13
K双マルチステ`ジビルド
l 光ステ`ジがK双にg?されることで症`docker build`より?堀晒されている
l 症`docker build`ではシ`ケンシャルなg?だった
stage C
FROM image AS stage-a
RUN build a
FROM image AS stage-b
RUN build b
FROM scratch
COPY --from=stage-a a /
COPY --from=stage-b b /
stage A stage B
14. Copyright(c)2022 NTT Corp. All Rights Reserved. 14
Dockerfileの宴旋?
l type=bind: context嶄のディレクトリや麿のステ`ジなどからマウント辛嬬
RUN --mount
l type=cache: コンパイラなどで聞うキャッシュをビルドgで慌嗤できる
l type=secret: 蜘畜Iなどsecretをイメ`ジにきzむことなく聞?辛嬬
l type=ssh: SSH agentU喇でSSH keyにアクセスできる
RUN --mount=type=cache,target=/root/.cache/go-build go build ´
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials aws s3 cp s3://´ ´
RUN --mount=type=ssh ssh Cq CT git@gitlab.com
docker/dockerfile:1.2
https://github.com/moby/buildkit/blob/v0.10.3/frontend/dockerfile/docs/syntax.md
15. Copyright(c)2022 NTT Corp. All Rights Reserved. 15
Dockerfileの宴旋?
l RUN、COPY凋綜の哈方にエスケ`プ?忖oしに}方?にわたる凋綜をける
l shebangやset凋綜が聞える
heredoc
FROM ubuntu
RUN <<EOT
set -eu -o pipefail
mkdir -p /foo/bar
echo hello > /foo/bar/hello
EOT
FROM python
RUN <<EOT
#!/usr/bin/env python
print(^hello world ̄)
EOT
docker/dockerfile:1.4
FROM ubuntu
COPY <<EOT /foo
foo
bar
EOT
https://github.com/moby/buildkit/blob/v0.10.3/frontend/dockerfile/docs/syntax.md
16. Copyright(c)2022 NTT Corp. All Rights Reserved. 16
Dockerfileの宴旋?
l キャッシュミスがしにくくなるよう恷m晒が仏された
l --link=falseとなり、COPY枠のsymlinkが{られないという`いに廣吭
COPY --link docker/dockerfile:1.4
https://github.com/moby/buildkit/blob/v0.10.3/frontend/dockerfile/docs/syntax.md
FROM ubuntu:22.04 AS dev
RUN echo foo > /foo
FROM busybox:1.34
COPY --link --from=dev /foo /
FROM ubuntu:22.04 AS dev
RUN echo foo > /foo
FROM alpine:3.16
COPY --link --from=dev /foo /
キャッシュを聞いまわせる
17. Copyright(c)2022 NTT Corp. All Rights Reserved. 17
マルチプラットフォ`ムイメ`ジ
l ?つのイメ`ジに}方のプラットフォ`ム鬚韻離ぅ瓸`ジをめzめる
l ランタイムは?蛍が借Pするホストのプラットフォ`ムに栽うものをxんでpullする
l Docker Buildxでビルド辛嬬[1]: https://medium.com/nttlabs/buildx-multiarch-2c6c2df00ca2
? QEMU聞??gDockerfileに筝音勣だがパフォ`マンスペナルティあり
? Dockerfile坪でクロスコンパイラ吉聞??壼い。Dockerfileに筝が駅勣
? タ`ゲットア`キテクチャのマシンを?吭してSSHU喇でビルド?壼い。マシンをe
余?吭する駅勣がある
docker buildx build Ct my/image Cpush ?
--platfom linux/amd64,linux/arm64 .
docker run my/image
Dockerfile
amd64?イメ`ジ
arm?イメ`ジ
???
amd64マシン
armマシン
マルチプラットフォ`
ム鬋ぅ瓸`ジ
pull
pull
[1] Akihiro Suda. ^Preparation toward running Docker on ARM Mac: Building multi-arch images with Docker BuildX ̄. https://medium.com/nttlabs/buildx-multiarch-2c6c2df00ca2
18. Copyright(c)2022 NTT Corp. All Rights Reserved. 18
リモ`トキャッシュ
l ビルドY惚はBuildKitをg?しているホスト貧だけでなく、レジストリなどリモ`トへの
キャッシュ隠隔が辛嬬
l Kubernetesでの蛍柊ビルドやCIジョブなど、ノ`ドgでキャッシュを慌嗤するのに聞える
l レジストリ參翌にもGitHub ActionsやS3へのキャッシュ鯉{もexperimentalにサポ`ト
local registry
inline
BuildKit
cache
ロ`カルなディレクトリ
にキャッシュ隠隔
キャッシュzみのイメ`
ジをレジストリにpush
BuildKit
image
+ cache
BuildKit
image cache
イメ`ジとキャッシュを
e?にレジストリにpush
19. Copyright(c)2022 NTT Corp. All Rights Reserved. 19
LLB?ビルド協xの嶄g燕F
LLB is to Dockerfile what LLVM IR is to C.
https://github.com/moby/buildkit#exploring-llb
l LLBにさえQできれば、販吭の?Zで峰したビルドをBulidKitでg?辛嬬
l ビルド?を協xしたDAGを燕Fするデ`タ夛protocol buffers
FROM busybox AS foo
RUN echo foo > /foo
FROM alpine AS bar
RUN echo bar > /bar
FROM scratch
COPY --from=foo /foo /
COPY --from=bar /bar /
LLB
Dockerfile
20. Copyright(c)2022 NTT Corp. All Rights Reserved. 20
さまざまなBuildKit?Z(?何)
Earthly Earthfile: https://github.com/earthly/earthly
l Earthly TechnologiesによるCI/CDフレ`ムワ`ク
l MakefileとDockerfileを栽わせたような隈でCI/CDのロジックがける
Dagger: https://github.com/dagger/dagger
l DaggerによるCI/CDフレ`ムワ`ク
l cue?ZでCI/CDロジックがける
buildkit-nix: https://github.com/AkihiroSuda/buildkit-nix
l Akihiro Sudaさんmobyメンテナ, BuildKitメンテナが_k
l Nix derivationをDockerfileとして?い、イメ`ジをビルドする
?Zのリスト?https://github.com/moby/buildkit#exploring-llb
? 2022/8/18r泣で11リストされている
? YAMLでビルドを峰するものや、RustやPythonなど蒙協?Zのアプリケ`ションのビル
ドに聞えるものなどいろいろある
21. Copyright(c)2022 NTT Corp. All Rights Reserved. 21
BuildKitの古勣
1.
?肝
3. BuildKitの嶄?の古勣
4. BuildKit v0.10からのC嬬と
これからのBuildKit
2. BuildKitのさまざまなC嬬
22. Copyright(c)2022 NTT Corp. All Rights Reserved. 22
BuildKitの撹?クライアントサ`バ
l ?蕉議に?ればクライアント?サ`バ
? クライアントライブラリが戻工されている
? サ`バ箸buildkitdというデ`モンプロセス
l サ`バはクライアントにgRPC API戻工
? ビルド、ビルドY惚の竃?、キャッシュ荷恬、
eコンテナg?などが辛嬬
l クライアントとサ`バは揖?ホスト貧でなくてもいい
クライアント
サ`バ
(buildkitd)
gRPC API
23. Copyright(c)2022 NTT Corp. All Rights Reserved.
クライアント
23
BuildKitクライアント
l クライアントライブラリを聞いサ`バにビルドを峺?
? ビルド協x?ZのO協
? ビルドY惚竃?枠の峺協
? キャッシュのインポ`ト?エクスポ`ト枠
l BuildKitのAPIは褒?
? clientもソ`スファイル?ビルドコンテキスト?レ
ジストリJ^秤鵑覆匹鯡畊するgRPC APIを隔つ
? buildkitdはビルド嶄駅勣に鬉犬謄ライアントにそ
れらをリクエスト
サ`バ
(buildkitd)
gRPC APIU喇で
ビルド峺?
gRPC
client
コンテキストや
credsを脅業勣箔
セッショ
ンサ`バ
24. Copyright(c)2022 NTT Corp. All Rights Reserved. 24
BuildKitクライアントツ`ルの箭
l buildctl https://github.com/moby/buildkit
? BuildKitプロジェクトで_kされるCLI
? ビルドやキャッシュ砿尖などBuildKit APIに?院するひ
ととおりのC嬬が聞える
l Docker Buildx https://github.com/docker/buildx
? Dockerによって_kされるBuildKit鬚吋咼襯CLI
? `docker build`にはないBuildKitのC嬬(リモ`トキャッ
シュ、multi-platform、Kubernetesでの蛍柊ビルド, etc)
が旋?辛嬬
サ`バ
(buildkitd)
クライアント
gRPC client?session
25. Copyright(c)2022 NTT Corp. All Rights Reserved. 25
BuildKitサ`バ
l ビルドにvするほとんどのことが?われる
? ビルド協xのパ`ス
? ビルド、キャッシュ
? ビルドY惚のエクスポ`ト, etc´
l gRPCU喇で荷恬?のControl APIを巷_
? ロ`カルのunixソケットU喇
? リモ`トのクライアントへの巷_も辛嬬
l ビルド協x?ZをLLBにQするコンポ`ネントがプラ
ガブル
? BuildKitにパッチを輝てることなく販吭の?Zのサ
ポ`トが辛嬬
クライアント
サ`バ
(buildkitd)
gRPC API
26. Copyright(c)2022 NTT Corp. All Rights Reserved. 26
BuildKitサ`バを撹する麼勣なコンポ`ネント
l frontend
? ソ`ス?Zのパ`スやLLBへのQ
? プラグインとして辛嬬
l solver
? LLBをg?する
? K双g?やキャッシュの旋?によりビルドを?堀晒
l worker
? コンテナやキャッシュ、snapshot、レイヤコンテンツ、
ビルドY惚のエクスポ`トなどを砿尖
? runcベ`スのg廾とcontainerdベ`スのg廾がある
? CNI pluginも旋?辛嬬
クライアント
gRPC API
frontend
solver
worker
サ`バbuildkitd
27. Copyright(c)2022 NTT Corp. All Rights Reserved. 27
BuildKit frontendによる販吭のビルド?Zの協x
l ソ`ス?ZをLLBにQするコンポ`ネント
l コンテナとしてg廾し、BuildKitにプラグイン辛嬬
l フロントエンドコンテナにはstdioを宥じてGateway APIと
よばれるgRPC APIが戻工される
? このAPIU喇でビルドコンテキストを函誼
? LLBを恬撹しそのg?をこのAPIU喇でBuildKitに峺?
クライアント
gRPC API
frontend
Gateway API戻工
(stdioU喇)
l Gateway APIはクライアント鬚APIとしても戻工される
l クライアントから?ると、buildkitd荷恬?APIControl
APIとGateway APIの2つが?える
l クライアントにフロントエンド議C嬬をg廾辛嬬
a?
サ`バbuildkitd
コンテナ
31. Copyright(c)2022 NTT Corp. All Rights Reserved. 31
BuildKit v0.10/dockerfile v1.4の麼なC嬬
l イメ`ジレイヤのRsフォ`マットとしてzstdがサポ`ト
? Zstandard/zstd: facebookが戻宛する?堀なRsフォ`マット
? https://github.com/facebook/zstd
? OCI Image Specificationでもzstdがイメ`ジレイヤとして協xされている(隆リリ`ス)
? https://github.com/opencontainers/image-spec/pull/788
? containerd(>=1.5.0)やPodmanなどのランタイムでもzstdのg?がサポ`トされている
? Dockerにもv22.06でサポ`トが?る嚠協: https://github.com/moby/moby/pull/41759
32. Copyright(c)2022 NTT Corp. All Rights Reserved. 32
これからのBuildKitに鬚韻迅h
l FROMのイメ`ジやADDにおけるgit repositoryのバ`ジョンを耕協するC嬬pinning
? https://github.com/moby/buildkit/pull/2943
? https://github.com/moby/buildkit/issues/2794
l イメ`ジのレイヤにセットされるtimestampの耕協
? https://github.com/moby/buildkit/pull/2918
l Dockerfileのコメントから岷俊Usageドキュメントを恬撹するC嬬
? https://github.com/moby/buildkit/pull/2841
l SBoM?撹のサポ`ト
? https://github.com/moby/buildkit/issues/2773
33. Copyright(c)2022 NTT Corp. All Rights Reserved. 33
これからのBuildKitに鬚韻迅h
l Dockerfile?の議デバッガ https://github.com/ktock/buildg
? breakpointや凋綜ごとにgHにコンテナを?ち貧げて嶄?を?たりできる
? gdb?の議CLIや、IDE(VS Code, Neovim, Emacs, ´)貧のGUIも聞える
? 繍栖議にはbuildxにもy栽されるはず
? https://github.com/docker/buildx/issues/1104