Kaniko 是 Google 造的輪子之一,用於在 Kubernetes 上無需 特權模式 構建 docker image

Kaniko 不依賴 Docker daemon 守護程序,而是完全在 userspace 中執行 Dockerfile 中的每個命令。這使您可以在 沒有特權模式 或沒有運行 Docker daemon 的環境(例如:Kubernetes集羣)中構建容器鏡像。

Kaniko 工作原理

傳統的 Docker build 是 Docker daemon 根據 Dockerfile,使用特權用戶(root)在宿主機依次執行,並生成鏡像的每一層。

Kaniko 工作原理和此類似, Kaniko 執行器獲取並展開基礎鏡像(在Dockerfile中FROM一行定義),按順序執行每條命令,每條命令執行完畢後爲文件系統做快照。快照是在用戶空間創建,並與內存中存在的上一個狀態進行對比,任何改變都會作爲對基礎鏡像的修改,並以新層級對文件系統進行增加擴充,並將任何修改都寫入鏡像的元數據中。當Dockerfile中每條命令都執行完畢後,執行器將新生成的鏡像推送到鏡像倉庫中。

Kaniko 解壓文件系統,執行命令,在執行器鏡像的用戶空間中對文件系統做快照,這都是爲什麼Kaniko不需要特權訪問的原因,以上操作中沒有引入任何 Docker daemon 進程或者 CLI 操作。

在 Kubernetes 中使用

前提條件

Kubernetes secret

解決目標 registry 認證問題,官方文檔中的樣例是通過添加一個 kaniko-secret.json 並把內容賦值給 GOOGLE_APPLICATION_CREDENTIALS 這個環境變量,如果是自建 registry 可以直接使用 docker config

$ echo "{\"auths\":{\"registry.example.com\":{\"username\":\"username\",\"password\":\"password\"}}}" > config.json

$ kubectl create configmap docker-config --from-file=config.json

configmap/docker-config created

使用 Pod 構建

apiVersion: v1
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
  - name: kaniko
    image: gcr.io/kaniko-project/executor:latest
    args: ["--dockerfile=<path to Dockerfile within the build context>",
            "--context=s3://<bucket name>/<path to .tar.gz>",
            "--destination=<aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:my-tag>"]
    volumeMounts:
      - name: docker-config
        mountPath: /kaniko/.docker/
      # when not using instance role
      - name: aws-secret
        mountPath: /root/.aws/
  restartPolicy: Never
  volumes:
    - name: docker-config
      configMap:
        name: docker-config
    # when not using instance role
    - name: aws-secret
      secret:
        secretName: aws-secret

Kaniko 一些構建參數

構建參數 解釋
–build-arg 構建時傳遞ARG值,可以多次傳遞
–cache 設置緩存, true 開啓緩存
–cache-repo 指定用來緩存的遠程倉庫
–cache-dir 定義緩存的目錄
–skip-tls-verify 倉庫地址是http時使用,不推薦生產使用
–cleanup 設置此標誌可在構建結束時清理文件系統
–registry-mirror 設置鏡像倉庫,默認 index.docker.io
相關文章