Open32

Cloud Native 読書会第8回 kaniko

Shimpei OtsuboShimpei Otsubo

Cloud Native 読書会

前回
毎月第3水曜日に少人数で集まり一緒に Cloud Native 技術のコードを読む会です。
Connpass と Wantedly で募集しています。

Role

  • @potsbo 司会 -> 全体進行
  • @taxio 裏方連絡

Timetable

  • Introduction 5 min
  • 自己紹介 15 min
  • 読書 60 min
  • 反省会/次回予告 10 min

概要

コードを読むことがなんだかんだ一番コスパの良い技術の学習方法だと @potsbo 考えています。もともとは Kubernetes 読書会として Kubernetes のコードを読む会をしていた事がありましたが、今回はそれの復活版で更に Kubernetes 以外のコードも読んでいいじゃないか、という会です。
かなりカジュアルに行っていた会で進め方も固まっているわけではありません。
皆さんのいろんな意見を聞きながら良い会にしていければなと思ってます。
(ちゃんとやるのが面倒になって中止してしまっていましたが結構評判が良かったので「続けること」を目標に再開しています。)
うまくいったら下の発表のような知見が得られることを期待しています。
https://speakerdeck.com/potsbo/kubernetes-cronjob-implementation-in-detail-number-k8sjp
https://speakerdeck.com/potsbo/configmap-vs-secret-number-k8sjp

前提

ハードルは低く行きます。「少人数だからこそ何でも聞いて良い」を前提にします。どんなに馬鹿に思える質問でもコードを追うことで理解するという解決策を取れば必ず良い学びになると思っています。
多分人の顔と名前も覚えてられないと思うので、「名前は覚えられていない」という前提を共有して進みましょう。

進め方

誰か一人の PC の画面共有をしながら議論をしながら何らかのテーマを解決していきます。全員が非公開 Podcast の出演者のような気持ちで積極的に発言してくれることを期待しています。
テーマはまだ決めていないので「そういえばここの挙動が気になる」というようなものがあると嬉しいです。

MikiMiki

普段はテクニカルサポートをやっています。
以前、Women Who Go Tokyoでkubernetesのコードリーディング会をやりました。
kanikoは読んだことないです。

Shimpei OtsuboShimpei Otsubo

kaniko is a tool to build container images from a Dockerfile, inside a container or Kubernetes cluster.

Shimpei OtsuboShimpei Otsubo

kaniko doesn't depend on a Docker daemon and executes each command within a Dockerfile completely in userspace.

Shimpei OtsuboShimpei Otsubo
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
Shimpei OtsuboShimpei Otsubo

docker inspect gcr.io/kaniko-project/executor:latest をすると /kaniko/executor が実行されている

Shimpei OtsuboShimpei Otsubo
	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
Shimpei OtsuboShimpei Otsubo

小ネタだけどこの d は Parse という関数に渡されているがそこでは []byte で受け取っている
なぜ []uint8 にしたんだ...

Shimpei OtsuboShimpei Otsubo

実際の parse は moby に結構投げてる
dockerfile をネットワークの外から持ってくるコードとかを入れるために wrap したかったのかな

Shimpei OtsuboShimpei Otsubo

なんで 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
}
Shimpei OtsuboShimpei Otsubo

感想

これまで読んだ OSS の中で1,2を争うコードの綺麗さだった
ちょっと読むだけで kaniko のことをすごく知った気になれる良いコードベースだった

taxiotaxio

感想

それぞれの処理のレイヤーが分かりやすかった。
きっと Docker Build の仕様について詳しくなったら更に読めるんだと信じている。

tomoasleeptomoasleep

完走した感想

めちゃくちゃ見通しが良くて完全に理解した気持ちになれるいいコードだった