Cloud Native 読書会第8回 kaniko
Cloud Native 読書会
前回
毎月第3水曜日に少人数で集まり一緒に Cloud Native 技術のコードを読む会です。
Connpass と Wantedly で募集しています。
Role
- @potsbo 司会 -> 全体進行
- @taxio 裏方連絡
Timetable
- Introduction 5 min
- 自己紹介 15 min
- 読書 60 min
- 反省会/次回予告 10 min
概要
コードを読むことがなんだかんだ一番コスパの良い技術の学習方法だと @potsbo 考えています。もともとは Kubernetes 読書会として Kubernetes のコードを読む会をしていた事がありましたが、今回はそれの復活版で更に Kubernetes 以外のコードも読んでいいじゃないか、という会です。
かなりカジュアルに行っていた会で進め方も固まっているわけではありません。
皆さんのいろんな意見を聞きながら良い会にしていければなと思ってます。
(ちゃんとやるのが面倒になって中止してしまっていましたが結構評判が良かったので「続けること」を目標に再開しています。)
うまくいったら下の発表のような知見が得られることを期待しています。
前提
ハードルは低く行きます。「少人数だからこそ何でも聞いて良い」を前提にします。どんなに馬鹿に思える質問でもコードを追うことで理解するという解決策を取れば必ず良い学びになると思っています。
多分人の顔と名前も覚えてられないと思うので、「名前は覚えられていない」という前提を共有して進みましょう。
進め方
誰か一人の PC の画面共有をしながら議論をしながら何らかのテーマを解決していきます。全員が非公開 Podcast の出演者のような気持ちで積極的に発言してくれることを期待しています。
テーマはまだ決めていないので「そういえばここの挙動が気になる」というようなものがあると嬉しいです。
@potsbo
kaniko は Kubernetes の中で docker image build できるらしいね!!って聞いたことがあるだけです。
@taxio
Wantedly のバックエンドエンジニアです。
Go は結構好きですが Cloud 系は初心者です!
普段はテクニカルサポートをやっています。
以前、Women Who Go Tokyoでkubernetesのコードリーディング会をやりました。
kanikoは読んだことないです。
wantedly の infra とか技術基盤をいい感じにする仕事をしています。
kaniko 名前しか知りません!!
v1.6.0 を読みます
kaniko is a tool to build container images from a Dockerfile, inside a container or Kubernetes cluster.
kaniko doesn't depend on a Docker daemon and executes each command within a Dockerfile completely in userspace.
docker daemon と関わりを持たない
https://github.com/opencontainers/image-spec を見るのが大事そう
apiVersion: v1
kind: Pod
metadata:
name: kaniko
spec:
containers:
- name: kaniko
image: gcr.io/kaniko-project/executor:latest
args: ["--dockerfile=/workspace/dockerfile",
"--context=dir://workspace",
"--destination=<user-name>/<repo>"] # replace with your dockerhub account
volumeMounts:
- name: kaniko-secret
mountPath: /kaniko/.docker
- name: dockerfile-storage
mountPath: /workspace
restartPolicy: Never
volumes:
- name: kaniko-secret
secret:
secretName: regcred
items:
- key: .dockerconfigjson
path: config.json
- name: dockerfile-storage
persistentVolumeClaim:
claimName: dockerfile-claim
docker inspect gcr.io/kaniko-project/executor:latest
をすると /kaniko/executor
が実行されている
https://github.com/GoogleContainerTools/kaniko/blob/v1.6.0/cmd/executor/cmd/root.go#L61 が tutorial の pod を起動した時に呼ばれる command だと思う
image, err := executor.DoBuild(opts)
if err != nil {
exit(errors.Wrap(err, "error building image"))
}
めっちゃ build してそう
var d []uint8
で作った d
に ReadAll の結果入れててそんなことしていいの?と思ったけど alias なので全然ありらしい
実は今知った事実...
// byte is an alias for uint8 and is equivalent to uint8 in all ways. It is
// used, by convention, to distinguish byte values from 8-bit unsigned
// integer values.
type byte = uint8
// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune = int32
小ネタだけどこの d
は Parse という関数に渡されているがそこでは []byte
で受け取っている
なぜ []uint8
にしたんだ...
この PR で入ったコード
上は間違いで本当は
linux職人何者なんだ
Parser は moby の buildkit を使っている。
実際の parse は moby に結構投げてる
dockerfile をネットワークの外から持ってくるコードとかを入れるために wrap したかったのかな
↑ 各 stage を build してる場所
なんで tar に固める実装とか自分で書いてるんだろうと思ったけど
file をなかったコトにするための whiteout とかを実装したかったからかなと思った
func (t *Tar) Whiteout(p string) error {
dir := filepath.Dir(p)
name := ".wh." + filepath.Base(p)
th := &tar.Header{
// Docker uses no leading / in the tarball
Name: strings.TrimLeft(filepath.Join(dir, name), "/"),
Size: 0,
}
if err := t.w.WriteHeader(th); err != nil {
return err
}
return nil
}
ちょっと面白そうな pull request 見つけた
感想
これまで読んだ OSS の中で1,2を争うコードの綺麗さだった
ちょっと読むだけで kaniko のことをすごく知った気になれる良いコードベースだった
感想
それぞれの処理のレイヤーが分かりやすかった。
きっと Docker Build の仕様について詳しくなったら更に読めるんだと信じている。
完走した感想
めちゃくちゃ見通しが良くて完全に理解した気持ちになれるいいコードだった
次回 Buildpacks!