Closed suzuki-shunsuke closed 4 years ago
$ 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
まずは https://github.com/GoogleContainerTools/kaniko の README を読んだ
概要
Docker Daemon がなくても Dockerfile を元に コンテナ image をビルドできるツール。 公式イメージである
gcr.io/kaniko-project/executor
を使うことが推奨され、それ以外は非推奨。kaniko の動作イメージ
known issue
gcr.io/kaniko-project/executor
以外で kaniko を使うのはサポート外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 クラスタ