<del id="nnjnj"></del><track id="nnjnj"></track>

<p id="nnjnj"></p>

<address id="nnjnj"></address>

    <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

      <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>

      • 自動秒收錄
      • 軟件:1973
      • 資訊:57811|
      • 收錄網站:279872|

      IT精英團

      企業操作和維護實踐-丟棄docker構建

      企業操作和維護實踐-丟棄docker構建

      瀏覽次數:
      評論次數:
      編輯: 樂詠
      信息來源: ITPUB
      更新日期: 2022-09-10 08:53:01
      摘要

      本章目錄目錄0x00前言簡述快速介紹什么是Kaniko?為啥用Kaniko?Kaniko是如何工作的?Kaniko已知功能問題kaniko構建上下文kaniko緩存構建0x01部署使用環境

      • 正文開始
      • 相關閱讀
      • 推薦作品

      本章目錄

      0x00前言簡介Kaniko是什么?為什么用Kaniko?Kaniko是怎么工作的?Kaniko已知函數問題kaniko構建上下文kaniko緩存構建0x01部署使用依賴于小型測試工具的環境在Kubernetes集群中構建和發布映像在Containerd.io中構建和發布映像在Docker中構建和發布映像使用kaniko構建和發布映像0x0n參考源

      起始地址:https://mp.weixin.qq.com/s/wchtH6i0xKrIrqSuYKmWkg

      原地址:https://blog.weiyigeek.top/2022/9-1-684.html

      00-1010

      0x00 前言簡述

      快速介紹

      什么是Kaniko?

      kaniko是一個從容器或Kubernetes集群內的Dockerfile構建Kubernetes中的容器映像的工具。

      溫馨提示: kaniko不是谷歌官方發布的產品。

      00-1010由于kaniko不依賴于Docker daemon,完全在用戶空間執行Dockerfile中的每一個命令,這使得在沒有Docker daemon的環境中(如標準的Kubernetes cluster V1.24.x)輕松或安全地構建容器映像成為可能。

      Kubernetes V1.24.x版本之后,默認采用containerd.io作為默認cri,不再支持docker-shim意味著我們不需要安裝docker環境。

      為啥用Kaniko?

      kaniko actuator image負責從Dockerfile構建映像并將其推送到注冊表。流程大致如下:

      首先,在performer映像中,我們提取基本映像的文件系統(來自Dockerfile中的映像)。其次,我們執行Dockerfile中的命令,然后拍攝用戶空間中每個文件系統的快照。然后,在每個命令之后,我們將一層已更改的文件附加到基礎映像(如果有)并更新映像元數據。

      Kaniko 是如何工作的?

      kaniko不支持構建Windows容器。Kaniko不支持v1注冊表API。(由于其不安全性,目前基本使用V2協議,如Harbor。)kaniko不支持在除官方Kaniko映像之外的任何Docker映像中運行二進制Kaniko可執行文件(即YMMV)。00-1010描述: kaniko的構建上下文與你發送Docker守護進程進行鏡像構建的構建上下文非常相似;它代表一個包含Dockerfile的目錄,kaniko將用它來構建您的圖像。

      例如,Dockerfile中的COPY命令應該引用構建上下文中的文件,因此您需要將構建上下文存儲在kaniko可以訪問的位置。

      目前,kaniko支持以下存儲解決方案:

      GCS buckets 3 bucket azure blob storage local directory local tar standard input git repository運行kaniko時,使用帶有適當前綴的- context標志來指定構建上下文的位置。如果不指定前綴kaniko,將假定使用本地目錄。該參數可按如下方式使用:

      sourceprefixexamplelolocal directory dir ://[kaniko中目錄的路徑

      container]dir:///workspaceLocal Tar Gztar://[path to a .tar.gz in the kaniko container]tar://path/to/context.tar.gzStandard Inputtar://[stdin]tar://stdinGCS Bucketgs://[bucket name]/[path to .tar.gz]gs://kaniko-bucket/path/to/context.tar.gzS3 Buckets3://[bucket name]/[path to .tar.gz]s3://kaniko-bucket/path/to/context.tar.gzAzure Blob Storagehttps://[account].[azureblobhostsuffix]/[container]/[path to .tar.gz]https://myaccount.blob.core.windows.net/container/path/to/context.tar.gzGit Repositorygit://[repository url][#reference][#commit-id]git://github.com/acme/myproject.git#refs/heads/mybranch#

      例如,要使用名為 kaniko-bucket 的 GCS 存儲桶,您需要傳入 --context=gs://kaniko-bucket/path/to/context.tar.gz 。

      溫馨提示:kaniko 允許的唯一標準輸入是 .tar.gz 格式, 如果要創建壓縮 tar,您可以運行 tar -C <path to build context> -zcvf context.tar.gz .命令。

      $ ls cache/Dockerfile# 壓縮上下文目錄$ tar -C cache/ -zcvf context.tar.gz .././Dockerfile# 查看壓縮文件$ tar -ztvf context.tar.gzdrwxr-xr-x root/root         0 2022-09-08 23:03 ./-rw-r--r-- root/root        52 2022-09-08 23:04 ./Dockerfile

      kaniko 緩存構建

      • Caching Layers :kaniko 可以在遠程存儲庫中緩存由RUN(由flag--cache-RUN-layers配置)和COPY(由flag--cache-COPY-layeers配置)命令創建的層。

        在執行命令之前 kaniko 會檢查層的緩存,如果存在 kaniko將拉取并提取緩存層,而不是執行命令。如果沒有 kaniko將執行命令,然后將新創建的層推送到緩存。
        用戶可以通過設置 --cache=true 標志選擇緩存,并且可以通過--cache-repo 標志提供用于存儲緩存層的遠程存儲庫, 如果未提供此標志則將從提供的--destination推斷緩存的repo。
        溫馨提示: 在緩存未命中后,kaniko無法從緩存中找到讀取層,所有后續層都將在本地構建,而無需咨詢緩存。

      • Caching Base Images: kaniko 可以將圖像緩存在本地目錄中,該目錄可以卷裝載到KanikoPod中。為此必須首先填充緩存, 我們在 gcr.io/kaniko-project/warmer 提供了一個kaniko緩存預熱映像:

        --image : 指定所需任意數量的圖像, 填充緩存后 使用與上述相同的 --cache=true 標志選擇緩存, 本地緩存的位置通過 --cache-dir 標志提供,默認為 /cache 與緩存預熱器一樣, 在實踐中通常與 Kubernetes 集群和持久緩存卷一起使用。
        示例: docker run -v $(pwd):/workspace gcr.io/kaniko-project/warmer:latest --cache-dir=/workspace/cache --image=<image to cache> --image=<another image to cache>


      0x01 部署使用

      環境依賴

      • kaniko 圖像鏡像
      • 一個 Kubernetes 集群 或者 一個 Containerd 容器運行環境。
      • 一個 dockerhub 帳戶 用于將構建的圖像公開。


      小試牛刀之在Kubernetes集群中構建并發布鏡像

      描述: 此處我們準備在一個K8S集群中使用kaniko提供的鏡像,按照提供的Dockerfile指令進行鏡像構建,并上傳到 docker hub 倉庫中,以下為操作流程、

      操作流程
      步驟 01.首先, 為了加快構建速度, 我們提前在集群中拉取 gcr.io/kaniko-project/executor 鏡像到本地, 由于國內無法直接拉取此處我采用這篇【使用Aliyun容器鏡像服務對海外gcr、quay倉庫鏡像進行鏡像拉取構建】 文章中的方法進行拉取構建國外gcr.io倉庫中的鏡像。

      # 此處我已經創建了國內可以訪問拉取的 executor 鏡像, 不想在Aliyun容器鏡像服務中進行創建拉取的朋友可以直接使用如下倉庫地址。registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest# 使用 ctr 或者 crictl 進行鏡像拉取$ crictl pull registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest$ crictl images | grep "kaniko-executor"registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor  latest  da9592dbe1de3   25.8MB

      步驟 02.準備一個 Dockerfile 此處將 registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor 鏡像打包上傳到hub中作為演示。

      # 創建存放dockerfile目錄以及持久化緩存目錄mkdir -vp /storage/dev/soft/kaniko/{cache,demo}cd /storage/dev/soft/kaniko/demotee dockerfile <<'EOF'FROM registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latestLABEL MAINTAINER=master@weiyigeeek.top BUILDTYPE=kanikoEOF

      步驟 03.創建一個授權令牌的 Secret , 此處以公共的docker hub為例。

      # 語法:~$ kubectl create secret docker-registry dockerhub --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email># 參數值:# <your-registry-server> is your Private Docker Registry FQDN. (https://index.docker.io/v1/ for DockerHub)# <your-name> is your Docker username.# <your-pword> is your Docker password.# <your-email> is your Docker email.# 創建示例: 此 docker-registry 將在 pod.yaml 配置中使用~$ kubectl create secret docker-registry dockerhub \--docker-server=https://index.docker.io/v1/ \--docker-username=weiyigeek \--docker-password=PASSWORD \--docker-email=master@weiyigeek.top# secret/dockerhub created# 查看創建的 secrets 情況~$ kubectl get secrets dockerhubNAME        TYPE                             DATA   AGEdockerhub   kubernetes.io/dockerconfigjson   1      16s~$ kubectl get secrets dockerhub -o yamlapiVersion: v1data:  .dockerconfigjson: eyJhdXRo*******VhsbE1qQXhPUT09In19fQ==kind: Secretmetadata:  name: dockerhub

      步驟 04.創建一個在k8s集群中運行的Pod,其資源清單如下所示:

      tee kaniko.yaml <<'EOF'apiVersion: v1kind: Podmetadata:  name: kanikospec:  containers:  - name: kaniko    image: registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest    env:    - name: DOCKERHUB      value: "docker.io"    - name: AUTHOR      value: "weiyigeek"    - name: IMAGE_NAME      value: "kaniko-executor"    - name: IMAGE_VERSION      value: "v1.9.0"    args: [ "--dockerfile=/workspace/dockerfile",            "--context=dir://workspace",            "--destination=docker.io/weiyigeek/kaniko-executor:v1.9.0",            "--cache",            "--cache-dir=/cache"]    volumeMounts:      - name: kaniko-secret        mountPath: /kaniko/.docker      - name: dockerfile-storage        mountPath: /workspace      - name: kaniko-cache        mountPath: /cache  restartPolicy: Never  nodeSelector:    kubernetes.io/hostname: "weiyigeek-226"  volumes:    - name: kaniko-secret      secret:        secretName: dockerhub        items:          - key: .dockerconfigjson            path: config.json    - name: dockerfile-storage      hostPath:        path: /storage/dev/soft/kaniko/demo        type: DirectoryOrCreate    - name: kaniko-cache      hostPath:        path: /storage/dev/soft/kaniko/cache        type: DirectoryOrCreateEOF# args 參數說明--dockerfile=/workspace/dockerfile   # 指定 dockerfile 路徑--context=dir://workspace            # 指定構建上下文--destination=docker.io/weiyigeek/kaniko-executor:v1.9.0  # 指定生成鏡像的tag--cache     # 使用緩存--cache-dir # 指定緩存目錄

      溫馨提示: kaniko 中的二進制可執行文件 executor 支持的參數詳解(https://github.com/GoogleContainerTools/kaniko/#additional-flags)

      步驟 05.執行 kubectl apply 部署資源清單生成運行 pod , 此處通過 kubectl logs 日志命令可以發現kaniko執行鏡像構建,以及上傳鏡像到docker hub之中

      kubectl apply -f kaniko.yaml# pod/kaniko createdkubectl logs -f kaniko# INFO[0005] Retrieving image manifest registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest# INFO[0005] Retrieving image registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest from registry registry.cn-hangzhou.aliyuncs.com# INFO[0006] Built cross stage deps: map[]# INFO[0006] Retrieving image manifest registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest# INFO[0006] Returning cached image manifest# INFO[0006] Executing 0 build triggers# INFO[0006] Building stage 'registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest' [idx: '0', base-idx: '-1']# INFO[0006] Skipping unpacking as no commands require it.# INFO[0006] LABEL MAINTAINER=master@weiyigeeek.top BUILDTYPE=kaniko# INFO[0006] Applying label MAINTAINER=master@weiyigeeek.top# INFO[0006] Applying label BUILDTYPE=kaniko# INFO[0006] Pushing image to docker.io/weiyigeek/kaniko-executor:v1.9.0

      步驟 06.在客戶端中可以使用 docker 或者 ctr 、crictl 命令將上傳到hub中的鏡像進行拉取, 并且查看hub倉庫中的 kaniko-executor:v1.9.0 鏡像信息(https://hub.docker.com/r/weiyigeek/kaniko-executor)。

      docker pull weiyigeek/kaniko-executor:v1.9.09d4299bbd943: Already exists..............a8dae3110e38: Already existsv1.9.0: Pulling from weiyigeek/kaniko-executorDigest: sha256:9b0ef02e7650d00d24bbca683e317bc103d6d842311ff13ec6daee60c37b1e62Status: Downloaded newer image for weiyigeek/kaniko-executor:v1.9.0docker.io/weiyigeek/kaniko-executor:v1.9.0

      步驟 07.擴展補充,除了上述方式指定dockerfile文件和上下文外,我們還可以在運行 kaniko 時使用標準輸入構建上下文,但需要添加 -i, --interactive參數, 一旦kaniko運行它將從STDIN獲取數據,并將構建上下文創建為壓縮tar,然后它將在啟動映像構建之前解包構建上下文的壓縮tar。

      如何使用 .tar.gz 標準輸入數據交互運行 kaniko 的完整示例,使用帶有臨時容器和完全無 docker 環境的 Kubernetes 命令行來進行鏡像構建與發布:

      echo -e 'FROM alpine \nRUN echo "created from standard input"' > Dockerfile | tar -cf - Dockerfile | gzip -9 | kubectl run kaniko-executor \--rm --stdin=true \--image=registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest --restart=Never \--overrides='{  "apiVersion": "v1",  "spec": {    "containers": [      {        "name": "kaniko-executor",        "image": "registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest",        "stdin": true,        "stdinOnce": true,        "args": [          "--dockerfile=Dockerfile",          "--context=tar://stdin",          "--destination=docker.io/weiyigeek/alpine:v4.2"        ],        "volumeMounts": [          {            "name": "kaniko-secret",            "mountPath": "/kaniko/.docker/"          }        ]      }    ],    "nodeSelector": {       "kubernetes.io/hostname": "weiyigeek-226"    },    "volumes": [      {        "name": "kaniko-secret",        "secret": {          "secretName": "dockerhub",          "items": [{"key":".dockerconfigjson", "path": "config.json"}]        }      },      {        "name": "dockerfile-storage",        "hostPath": {          "path": "/storage/dev/soft/kaniko/demo",          "type": "DirectoryOrCreate"        }      },      {        "name": "kaniko-cache",        "hostPath": {          "path": "/storage/dev/soft/kaniko/cache",          "type": "DirectoryOrCreate"        }      }    ]  }}'

      執行結果:

      INFO[0003] Retrieving image manifest alpineINFO[0003] Retrieving image alpine from registry index.docker.ioINFO[0009] Built cross stage deps: map[]INFO[0009] Retrieving image manifest alpineINFO[0009] Returning cached image manifestINFO[0009] Executing 0 build triggersINFO[0009] Building stage 'alpine' [idx: '0', base-idx: '-1']INFO[0009] Unpacking rootfs as cmd RUN echo "created from standard input" requires it.INFO[0036] RUN echo "created from standard input"INFO[0036] Initializing snapshotter ...INFO[0036] Taking snapshot of full filesystem...INFO[0036] Cmd: /bin/shINFO[0036] Args: [-c echo "created from standard input"]INFO[0036] Running: [/bin/sh -c echo "created from standard input"]created from standard inputINFO[0036] Taking snapshot of full filesystem...INFO[0037] No files were changed, appending empty layer to config. No layer added to image.INFO[0037] Pushing image to docker.io/weiyigeek/alpine:v4.2INFO[0042] Pushed index.docker.io/weiyigeek/alpine@sha256:0ef53bcc0a6f261124e5f292fa17041d7e5f81f5542802b89c249351597167e4pod "kaniko-executor" deleted

      至此在 K8s 集群中使用 kaniko 構建鏡像簡單演示結束。


      小試牛刀之在Containerd.io中構建并發布鏡像

      描述:當我們的環境中只安裝了containerd.io 容器運行時沒有 Docker 或者 Kubernetes 環境時,我們也可以采用kaniko進行鏡像構建與發布,具體操作流程步驟如下:

      環境說明

      $ lsb_release -aDistributor ID: UbuntuDescription:    Ubuntu 20.04.3 LTSRelease:        20.04Codename:       focal$ containerd -vcontainerd containerd.io 1.4.12 7b11cfaabd73bb80907dd23182b9347b4245eb5d$ ctr -vctr containerd.io 1.4.12

      溫馨提示: 此處使用的是 Ubuntu 20.04 操作系統, 該系統已做安全加固和內核優化符合等保2.0要求【SecOpsDev/Ubuntu-InitializeSecurity.sh at master · WeiyiGeek/SecOpsDev 】, 如你的Linux未進行相應配置環境可能與讀者有些許差異, 如需要進行(windows server、Ubuntu、CentOS)安全加固請參照如下加固腳本進行加固, 請大家瘋狂的star 。
      加固腳本地址:【 https://github.com/WeiyiGeek/SecOpsDev/blob/master/OS-操作系統/Linux/Ubuntu/Ubuntu-InitializeSecurity.sh 】

      溫馨提示:如果你使用的是最新 Ubuntu 22.04 操作系統,并需要對其安全加固和內核優化以滿足等保2.0要求可參考如下加固腳本 【https://github.com/WeiyiGeek/SecOpsDev/tree/master/OperatingSystem/Security/Ubuntu】。


      操作流程

      步驟 01.此處假設你已經安裝配置好containerd.io了,如果沒有安裝配置請參考此篇文章【 1.Containerd容器運行時初識與嘗試 - https://blog.weiyigeek.top/2021/6-27-570.html 】,此處不再累述。

      步驟 02.驗證 containerd.io 服務狀態以及提前拉取 kaniko-executor:latest 鏡像以加快構建速度,此處將鏡像拉到默認的名稱空間下。

      $ systemctl status containerd.service● containerd.service - containerd container runtime     Loaded: loaded (/lib/systemd/system/containerd.service; enabled; vendor preset: enabled)     Active: active (running) since Thu 2022-09-08 11:48:30 CST; 4h 49min ago       Docs: https://containerd.io    Process: 561811 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)   Main PID: 561812 (containerd)      Tasks: 106     Memory: 4.0G$ ctr -n default images pull registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest

      步驟 03.準備登錄 hub docker 的賬號以及密碼,你可以按照下述的流程進行生成config.json文件。

      mkdir /storage/dev/soft/kaniko/{config,demo1}cd /storage/dev/soft/kaniko/config# 生成認證所需的憑據# BASE64 編碼,注意下述為格式為 你的hub賬號:你的hub密碼AUTH=$(echo -n "weiyigeek:password" | base64)# BASE64 解碼echo ${AUTH} | base64 -d# 使用該方法可以解析變量 AUTH (值得注意)cat > config.json <<EOF{  "auths": {    "https://index.docker.io/v1/": {        "auth": "${AUTH}"    }  }}EOF# 生成結果cat config.json{  "auths": {    "https://index.docker.io/v1/": {        "auth": "d2VpeWlnZ************AxOQ=="    }  }}

      步驟 04.準備dockerfile文件,此處將busybox:1.35.0鏡像重新構建后上傳到我的賬戶下的hub倉庫中,該文件示例如下:

      cd /storage/dev/soft/kaniko/demo1tee dockerfile <<'EOF'FROM docker.io/library/busybox:1.35.0LABEL MAINTAINER=master@weiyigeeek.top BUILDTOOLS=kaniko BUILDENV=containerd.io;ENTRYPOINT ["/bin/sh", "-c", "echo hello,busybox"]EOF

      步驟 05.當上述都準備完成后我們便可以執行containerd.io提供的ctr客戶端工具直接創建容器,例如如下命令:

      ctr -n default run --rm --net-host --env DOCKERHUB=docker.io \--mount type=bind,src=/storage/dev/soft/kaniko/config,dst=/kaniko/.docker,options=rbind:ro \--mount type=bind,src=/storage/dev/soft/kaniko/demo1,dst=/workspace,options=rbind:rw \registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest kaniko-executor \/kaniko/executor --dockerfile=/workspace/dockerfile --context=dir://workspace --destination=docker.io/weiyigeek/busybox:1.35.0# 參數說明-n 指定名稱空間--rm 在退出容器時刪除容器--net-host 使用主機網絡--env 指定容器內部shell變量--mount 指定掛載到容器內部的本地文件,src是指定宿主機上文件目錄路徑,而dst是指定容器內部目錄。

      執行結果:

      INFO[0002] Retrieving image manifest docker.io/library/busybox:1.35.0INFO[0002] Retrieving image docker.io/library/busybox:1.35.0 from registry index.docker.ioINFO[0006] Built cross stage deps: map[]INFO[0006] Retrieving image manifest docker.io/library/busybox:1.35.0INFO[0006] Returning cached image manifestINFO[0006] Executing 0 build triggersINFO[0006] Building stage 'docker.io/library/busybox:1.35.0' [idx: '0', base-idx: '-1']INFO[0006] Skipping unpacking as no commands require it.INFO[0006] LABEL MAINTAINER=master@weiyigeeek.top BUILDTOOLS=kaniko BUILDENV=containerd.io;INFO[0006] Applying label MAINTAINER=master@weiyigeeek.topINFO[0006] Applying label BUILDTOOLS=kanikoINFO[0006] Applying label BUILDENV=containerd.io;INFO[0006] ENTRYPOINT ["/bin/sh", "-c", "echo hello,busybox"]INFO[0006] Pushing image to docker.io/weiyigeek/busybox:1.35.0INFO[0010] Pushed index.docker.io/weiyigeek/busybox@sha256:d6ed480cc7864b9e19b40f09263abfad4689a9244a5abeb2e3eaf14a439cc55f

      步驟 06.查看上傳到docker hub中 的 busybox:1.35.0 鏡像信息以及拉取到本地進行運行測試驗證。

      ctr -n default images pull docker.io/weiyigeek/busybox:1.35.0ctr -n default run --rm docker.io/weiyigeek/busybox:1.35.0 busyboxhello,busybox

      至此,在containerd.io 環境中,進行鏡像構建并發布到hub中實踐完畢!


      小試牛刀之在Docker中使用kaniko構建并發布鏡像

      描述:前面說到kaniko的出現實際是為了在沒有docker環境的情況之下,按照 Dockerfile 文件中的指令進行鏡像構建,不過此處還是簡單的介紹一下在docker環境中的使用。 (實際情況中不建議如此多此一舉)

      步驟 01.執行如下命令生成 docker hub 認證票*據(存儲路徑為 ~/.docker/config.json)以及提前拉取 kaniko 項目中 executor:latest 鏡像。

      docker login -u weiyigeek# Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.# Login Succeededdocker pull registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest

      步驟 02.創建 dockerfile 文件其中 FROM 指定 K8S 集群中常用的NFS動態持久卷鏡像,我們將其上傳到 hub 倉庫中的WeiyiGeek賬戶下面。

      mkdir /storage/dev/soft/kaniko/demo2cd /storage/dev/soft/kaniko/demo2tee dockerfile <<'EOF'FROM registry.cn-hangzhou.aliyuncs.com/weiyigeek/nfs-subdir-external-provisioner:latestLABEL MAINTAINER=master@weiyigeeek.top BUILDTOOLS=kaniko BUILDENV=docker;EOF

      步驟 03.使用如下示例命令進行 kaniko-executor 容器的創建運行,并進行鏡像構建并上傳到公共的docker hub 倉庫中。

      docker rm -f kaniko-executordocker run --rm --name kaniko-executor \    -v $HOME/.docker/:/kaniko/.docker \    -v /storage/dev/soft/kaniko/demo2:/workspace \    registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest \    --dockerfile=/workspace/dockerfile --context=dir://workspace --destination=docker.io/weiyigeek/nfs-subdir-external-provisioner:latest

      執行結果:

      INFO[0002] Retrieving image manifest registry.cn-hangzhou.aliyuncs.com/weiyigeek/nfs-subdir-external-provisioner:latestINFO[0002] Retrieving image registry.cn-hangzhou.aliyuncs.com/weiyigeek/nfs-subdir-external-provisioner:latest from registry registry.cn-hangzhou.aliyuncs.comINFO[0003] Built cross stage deps: map[]INFO[0003] Retrieving image manifest registry.cn-hangzhou.aliyuncs.com/weiyigeek/nfs-subdir-external-provisioner:latestINFO[0003] Returning cached image manifestINFO[0003] Executing 0 build triggersINFO[0003] Building stage 'registry.cn-hangzhou.aliyuncs.com/weiyigeek/nfs-subdir-external-provisioner:latest' [idx: '0', base-idx: '-1']INFO[0003] Skipping unpacking as no commands require it.INFO[0003] LABEL MAINTAINER=master@weiyigeeek.top BUILDTOOLS=kaniko BUILDENV=docker;INFO[0003] Applying label MAINTAINER=master@weiyigeeek.topINFO[0003] Applying label BUILDTOOLS=kanikoINFO[0003] Applying label BUILDENV=docker;INFO[0003] Pushing image to docker.io/weiyigeek/nfs-subdir-external-provisioner:latestINFO[0012] Pushed index.docker.io/weiyigeek/nfs-subdir-external-provisioner@sha256:4dc0d27b8fa4608c9e2d8a6f2368d2029df32b9b55f96f27a9218a620ea14828

      步驟 04.查看上傳到docker hub 倉庫中的 nfs-subdir-external-provisioner:latest 信息 (https://hub.docker.com/r/weiyigeek/nfs-subdir-external-provisioner) 。

      步驟 05.當然我們也可以在安裝有docker環境中使用上下文使用標準輸入,并采用docker進行創建kaniko-executor容器,從標準輸入接收dockerfile文件并進行鏡像構建與推送。

      mkdir /storage/dev/soft/kaniko/demo3echo -e 'FROM alpine \nRUN echo "created from standard input"' > Dockerfile | tar -cf - Dockerfile | gzip -9 | docker run \  --interactive -v /storage/dev/soft/kaniko/demo3:/workspace  -v $HOME/.docker/:/kaniko/.docker \  registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest \  --context tar://stdin \  --destination=docker.io/weiyigeek/alpine:4.2

      執行結果: 如果在交互運行期間沒有數據管道傳輸,則需要按Ctrl+D自行發送EOF信號。

      INFO[0000] To simulate EOF and exit, press 'Ctrl+D'INFO[0002] Retrieving image manifest alpineINFO[0002] Retrieving image alpine from registry index.docker.ioINFO[0005] Built cross stage deps: map[]INFO[0005] Retrieving image manifest alpineINFO[0005] Returning cached image manifestINFO[0005] Executing 0 build triggersINFO[0005] Building stage 'alpine' [idx: '0', base-idx: '-1']INFO[0005] Unpacking rootfs as cmd RUN echo "created from standard input" requires it.INFO[0008] RUN echo "created from standard input"INFO[0008] Initializing snapshotter ...INFO[0008] Taking snapshot of full filesystem...INFO[0008] Cmd: /bin/shINFO[0008] Args: [-c echo "created from standard input"]INFO[0008] Running: [/bin/sh -c echo "created from standard input"]created from standard inputINFO[0008] Taking snapshot of full filesystem...INFO[0008] No files were changed, appending empty layer to config. No layer added to image.INFO[0008] Pushing image to docker.io/weiyigeek/alpine:4.2INFO[0016] Pushed index.docker.io/weiyigeek/alpine@sha256:49360dc74ecf57ea94fbec9d7a3b5cf59dfba8aa5e60f8802cc6299e668a3e1e

      至此,在 Docker 中使用 kaniko 進行鏡像構建與發布實踐完畢。


      0x0n 參考來源

      項目地址: https://github.com/GoogleContainerTools/kaniko
      kaniko 圖像鏡像倉庫: gcr.io/kaniko-project/executor
      kaniko 國內鏡像倉庫源:weiyigeek/kaniko-executor:latest 或者 registry.cn-hangzhou.aliyuncs.com/weiyigeek/kaniko-executor:latest

      原文地址: https://blog.weiyigeek.top/2022/9-1-684.html

      本文至此完畢,更多技術文章,盡情期待下一章節!

      標簽:鏡像 緩存 容器
      開發者如何在應用后臺直接控制用戶的運動狀態?
      ? 上一篇 2022-09-10
      解決ShardingJdbc不支持復雜SQL問題的說明
      下一篇 ? 2022-09-10
      • 如何在Ubuntu中保留文件系統并備份當前開發板鏡像
        0閱讀 0條評論 個贊
        在Ubuntu保留文件系統或者說備份當前開發板鏡像的需求在不斷增加。比如Ubuntu文件系統需要安裝庫文件的話直接使用apt-get工具就可以下載,但由于需要下載的核心板較多,比較費時間,這時需要將安……
      • 國產核心板全志T507助力消防系統升級
        0閱讀 0條評論 個贊
        9月16日下午,位于湖南長沙市區內的中國電信大樓發生火災,建筑高度218米,現場濃煙滾滾,數十層樓體燃燒劇烈。消防救援人員趕到現場后很快將火勢控制住,目前大樓火勢已被撲滅,所幸未發現人員傷亡。湖南電信……
      • 教大家如何處理Spring Boot易流中的用戶和群體!
        0閱讀 0條評論 個贊
        1.準備工作2.用戶操作2.1添加用戶2.2修改用戶2.3刪除用戶2.4查詢用戶3.組操作3.1添加組3.2修改組3.3刪除組3.4查詢組4.查看表詳情雖然說我們在實際開發中,……
      • 從PG15開始WAL壓縮優化
        0閱讀 0條評論 個贊
        PG15傳聞中的超級令人激動的功能大多數跳票了,年初我也寫過一個關于PG15新功能跳票的文章。PG15BETA已經發出幾個月了,似乎PG15里令人激動人心的功能不多,不過從長長的新功能列表里,……
      • 深入了解美團葉子發射器開源方案
        0閱讀 0條評論 個贊
        大家好,我是樹哥。之前我們有聊過「如何設計一個分布式ID發號器」,其中有講過4種解決方案,分別是:UUID類雪花算法數據庫自增主鍵Redis原子自增美團以第2、3種解決方案為基礎,開發出……
      發表評論 共有條評論
      用戶名: 密碼:
      驗證碼: 匿名發表
      • Python自學教程7:字典類型有什么用
        0閱讀 0條評論 個贊
        字典是Python中的一個重要操作,如果字典玩得順,很多其他的數據類型就可以一通百通。Python字典的定義字典使用一對大括號進行定義,鍵值對之間使用逗號隔開,鍵和值使用冒號分隔。鍵必須是不可變類型,……
      • sql server系統表的詳細說明
        0閱讀 0條評論 個贊
        sysaltfiles主數據庫保存數據庫的文件syscharsets主數據庫字符集與排序順序sysconfigures主數據庫配置選項syscurconfigs主數據庫當前配置選項sysdatab……
      • Javascript的異步循環打印主題
        0閱讀 0條評論 個贊
        這道題,我相信很多前端從業者都知道,它本質上來說并不復雜,但是卻可以有很深遠的擴展,最終核心的主題其實就是異步的執行,其中對于題目的解法,還涉及到一些作用域的知識。那么我們以最簡版的題目入手,逐步深入……
      • 基于iframe的微前端框架——青田
        33閱讀 0條評論 個贊
        vivo互聯網前端團隊-JiangZuohan一、背景VAPD是一款專為團隊協作辦公場景設計的項目管理工具,實踐敏捷開發與持續交付,以「項目」為核心,融合需求、任務、缺陷等應用,使用敏捷迭代、小……
      • ASP.NET核心6框架揭示示例演示[34]:緩存整個響應內容
        0閱讀 0條評論 個贊
        我們利用ASP.NET開發的大部分API都是為了對外提供資源,對于不易變化的資源內容,針對某個維度對其實施緩存可以很好地提供應用的性能?!秲却婢彺媾c分布式緩存的使用》介紹的兩種緩存框架(本地內存緩存和……
      • Sql Server系列:分區表操作
        0閱讀 0條評論 個贊
        1.分區表簡介分區表在邏輯上是一個表,而物理上是多個表。從用戶角度來看,分區表和普通表是一樣的。使用分區表的主要目的是為改善大型表以及具有多個訪問模式的表的可伸縮性和可管理性。分區表是把數據……
      • SQL Server的常用分頁SQL
        0閱讀 0條評論 個贊
        今天無聊和朋友討論分頁,發現網上好多都是錯的。網上經常查到的那個TopNotin或者Max大部分都不實用,很多都忽略了Order和性能問題。為此上網查了查,順帶把2000和2012版本的也補上……
      • SpringMVC 01: SpringMVC第一個SpringMVC項目
        0閱讀 0條評論 個贊
        SpringMVCSpringMVC概述:是基于MVC開發模式的框架,用來優化控制器是Spring家族的一員,也具備IOC和AOP什么是MVC:它是一種開發模式,是模型視圖控制器的簡稱,所有的web應……
      • sql server索引I摘要
        0閱讀 0條評論 個贊
        一、存儲結構在SQLServer中,有許多不同的可用排列規則選項。二進制:按字符的數字表示形式排序(ASCII碼中,用數字32表示空格,用68表示字母"D")。因為所有內容都表示為數字,所以……
      • 用戶自定義注釋 AOP實現的日志保存(數據庫) 所有代碼都可以粘貼復制
        0閱讀 0條評論 個贊
        前言1,在一些特定的場景我們往往需要看一下接口的入參,特別是跨系統的接口調用(下發,推送),這個時候的接口入參就很重要,我們保存入參入庫,如果出問題就可以馬上定位是上游還是下游的問題(方便扯皮)2,還……
      • 二戰MySQL數據庫【升華】
        0閱讀 0條評論 個贊
        MYSQL入門系列——第二篇1.篩選條件:(1)比較運算符:(2)邏輯運算符:(3)其他操作:1.排序:2.限制:拓展:3.去重:4.模糊查詢:(like'%')5.范圍查詢:2.聚合與分組(重點……
      • 面試官:談談你對mysql事務的認識?
        0閱讀 0條評論 個贊
        引言今天回頭繼續講講數據庫系列的文章。這篇文章屬于mysql數據庫系列,我們來談談事務方面的常見面試題。那么,具體題目有下面這些:1、講講為什么用事務?事務的四大特性?事務的隔離級別知道吧,你們生產……
      • 與docker卷一起安裝的注意事項
        0閱讀 0條評論 個贊
        目錄Content使用數據卷(volume)使用掛載點(共享宿主目錄,bindmount)目錄兼容性可移植性目錄替代相關指定位置--volume與--mount區別鏡像保存docker-compos……
      • 百度工程師教你玩設計模式(工廠模式)
        0閱讀 0條評論 個贊
        作者|北極星小組想要寫好代碼,設計模式(DesignPattern)是必不可少的基本功,設計模式是對面向對象設計(ObjectOrientedDesign)中反復出現的問題的解決方案,本篇介紹……
      • 如何優雅地轉換Bean對象
        0閱讀 0條評論 個贊
        背景我們的故事要從一個風和日麗的下午開始說起!這天,外包韓在位置上寫代碼~外包韓根據如下定義PO(persistantobject):持久化對象,可以看成是與數據庫中的表相映射的java對象。最……
      • 談談動態線程池的9個場景(改進版)
        0閱讀 0條評論 個贊
        大家好,我是小馬哥。線程池是一種基于池化思想管理線程的工具,使用線程池可以減少創建銷毀線程的開銷,避免線程過多導致系統資源耗盡。在高并發以及大批量的任務處理場景,線程池的使用是必不可少的?!?/div>
      • [PostgreSql]生產級數據庫安裝需要考慮哪些問題?
        0閱讀 0條評論 個贊
        大家好,我是字母哥(coder)!我讓公司的小伙伴寫一個生產級別的PostgreSQL的安裝文檔,結果他和我說:“不是用一個命令就能安裝好么?還用寫文檔么?”。我知道他想說的是這個命令:yumins……
      • 每分鐘寫6億條數據 攜程監控系統Dashboard存儲升級實踐
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      • Linux驅動開發十六 輸入系統33543 系統附帶的輸入驅動程序
        0閱讀 0條評論 個贊
        前面兩章我們通過input子系統構建了一個按鍵類型的輸入設備的驅動,其實Linux的內核還提供了一套基于GPIO的按鍵驅動程序,和LED設備一樣,我們只需要在編譯內核的過程中進行配置然后在設備樹中定義……
      • 記錄在線超時的分析和故障排除過程
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      最近發布資訊
      更多
      警花高潮嗷嗷叫
      <del id="nnjnj"></del><track id="nnjnj"></track>

      <p id="nnjnj"></p>

      <address id="nnjnj"></address>

        <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

          <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>