suzuki-shunsuke / issue

MIT License
4 stars 0 forks source link

kaniko を試してみる #33

Closed suzuki-shunsuke closed 4 years ago

suzuki-shunsuke commented 4 years ago

まずは https://github.com/GoogleContainerTools/kaniko の README を読んだ

概要

Docker Daemon がなくても Dockerfile を元に コンテナ image をビルドできるツール。 公式イメージである gcr.io/kaniko-project/executor を使うことが推奨され、それ以外は非推奨。

kaniko の動作イメージ

  1. Dockerfile の FROM からベースイメージのファイルシステムを抽出
  2. Dockerfile に従ってコマンドを実行
  3. base image に変更を layer として追加
  4. image metadata を更新
  5. Docker Registry にイメージをプッシュ

known issue

build context

https://github.com/GoogleContainerTools/kaniko#kaniko-build-contexts

Dockerfile の COPY コマンドなどで参照されるビルドコンテキスト。

今回は

を試してみる。 S3 や private repository の場合はクレデンシャルを渡す必要がある。

Docker registry

今回は Quay.io でサンプル repository と robot account を作り、 そのアカウントのクレデンシャルを使ってみる。

クレデンシャルを公式イメージのコンテナの /kaniko/.docker/config.json にマウントすれば良い。

kaniko の実行環境

kaniko をどこで実行するか。

https://github.com/GoogleContainerTools/kaniko#running-kaniko

k8s クラスタ

suzuki-shunsuke commented 4 years ago

kind

$ kind create cluster --name kaniko
$ kubectl cluster-info --context kind-kaniko
$ kubectl create namespace kaniko
$ kubens kaniko
$ kubectl create secret generic image-registry --from-file=docker-config.json

最初 --build-arg を指定するの忘れてビルド失敗

今度は push に失敗。 /kaniko/.docker/config.json がおかしいのかもしれない

kaniko kaniko error pushing image: failed to push to destination quay.io/suzuki_shunsuke/test-kaniko:v0.1.0: MANIFEST_INVALID: manifest invalid; map[message:manifest schema version not supported]

試しに別の pod を作って /kaniko/.docker/config.json の中身を確認したが、特におかしくない。

---
apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
  - name: test
    image: alpine:3.10.3
    command: ["tail"]
    args: ["-f", "/dev/null"]
    volumeMounts:
      - name: image-registry
        mountPath: /kaniko/.docker
  restartPolicy: Never
  volumes:
  - name: image-registry
    secret:
      secretName: image-registry
      items:
      - key: docker-config.json
        path: config.json
$ kubectl apply -f test.yaml
$ kubectl exec -ti test sh
$ cat /kaniko/.docker/config.json

https://github.com/GoogleContainerTools/kaniko/issues/400

quay.io のリポジトリが schema 2 をサポートしていない??

https://coreos.com/blog/quay-support-docker-v2-and-v1

quay.io だと難しそうなので Docker Hub で token を発行して Docker Hub にプッシュしてみる。

https://hub.docker.com/settings/security から発行できた。

余談だけど、 quay.io のほうが robot account でリポジトリ単位で権限を制限できるので好き。

$ echo -n <Docker Hub のユーザー名>:<access token> | base64
{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "xxxxxxxxxxxxxxx"
        }
    }
}

間違えて access token をそのまま書くと push に失敗する

kaniko kaniko error checking push permissions -- make sure you entered the correct tag name, and that you are authenticated correctly, and try again: checking push permission for
 "index.docker.io/suzukishunsuke/test-kaniko:v0.1.0": creating push check transport for index.docker.io failed: unsupported status code 400

apply した際に log が見れるように stern でログを監視しておく。

$ stern ".*"
---
apiVersion: v1
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
  - name: kaniko
    image: gcr.io/kaniko-project/executor:latest
    args: ["--dockerfile=Dockerfile",
            "--context=git://github.com/suzuki-shunsuke/docker-image-terraform-graylog.git",
            "--destination=suzukishunsuke/test-kaniko:v0.1.0",
            "--build-arg=TERRAFORM_VERSION=0.12.19", "--build-arg=GO_GRAYLOG_VERSION=10.0.2"]
    volumeMounts:
      - name: image-registry
        mountPath: /kaniko/.docker
  restartPolicy: Never
  volumes:
  - name: image-registry
    secret:
      secretName: image-registry
      items:
      - key: docker-hub-config.json
        path: config.json
$ kubectl delete secret image-registry
$ kubectl create secret generic image-registry --from-file=docker-hub-config.json
$ kubectl apply -f pod.yaml
suzuki-shunsuke commented 4 years ago

gVisor

https://gvisor.dev/docs/user_guide/install/

Mac で動かないので、 Vagrant とかで VM 起動する必要ありそう