自定義一個kaniko映象
工具與資源中心
幫助開發者更加高效的工作,提供圍繞開發者全生命週期的工具與資源
https://developer.aliyun.com/tool/?spm=a1z389.11499242.0.0.65452413KFoX5Y&utm_content=g_1000295017
背景
kaniko是一款方便我們從K8S內部構建docker容器的工具,以前我們在CI過程中,使用的是docker-in-docker技術,這種技術最主要的缺陷就是當一臺機器上同時執行多個docker build流水線時,會出現阻塞的情況,因為這一批流水線用的是宿主機上的同一個docker程式。
基於這種情況,我們在droneCI流水線中換用了kaniko來進行docker映象的建立。
遇到的難題
- kaniko是基於scratch構建的,裡面沒有shell,所以想在kaniko原生映象裡在呼叫python是很麻煩的
- kaniko建立docker映象使用的是file system功能,如果想在一個kaniko容器裡先建立ubuntu映象,再建立alpine映象, 是會有各種衝突問題的,需要使用–cleanup功能。此功能會清空檔案系統,同時如果有自己裝的shell,也會被清空,導致無法再次使用
解決方案
- kaniko的關鍵檔案其實是/kaniko目錄下的哪些 二進位制檔案,官方推薦是用 gcr.io /kaniko-project/executor 映象,其實我們可以複製這個/kaniko目錄到我們自己的私有映象
- shell沒有的話,我們可以複製一個busybox進去,這樣就有shell了
- 雖然–cleanup會清空file system,但是根據程式碼裡的ignorepath設定,volume掛載目錄和/kaniko目錄會被忽略掉。所以我們可以有兩種方式選擇:一、透過volume的方式哦掛載busybox和自己的python程式碼到私有映象裡。二、把busybox和python程式碼加入/kaniko目錄。
示例程式碼
Dockerfile如下:
FROM heiheidoc/kaniko-project-executor:v1.3.0 AS plugin # 1.6.0的clean up有問題 FROM heiheidoc/kaniko-project-executor:debug AS debug FROM python:3.9.5-buster COPY --from=背景plugin /kaniko /kaniko COPY --from=debug /busybox /kaniko/busybox ADD . /kaniko ENV DOCKER_CONFIG /kaniko/.docker CMD ["python3","/kaniko/main.py"]
部分python程式碼如下,功能是按照一定規則生成Docker映象:
def run_shell(shell): print_green(shell) cmd = subprocess.Popen(shell, stdin=subprocess.PIPE, stderr=sys.stderr, close_fds=True, stdout=sys.stdout, universal_newlines=True, shell=True,executable='/kaniko/busybox/sh', bufsize=1) cmd.communicate() return cmd.returncode def run_executor(): for folder_name, sub_dir, files in os.walk(os.getcwd()): if 'Dockerfile' in files: Dockefile_path = folder_name + "/Dockerfile" docker_info = folder_name.replace(os.getcwd(),'').split('/') harbor_image_name = REGISTRY_URL + "/" + owner_name + "/" + docker_info[1] + ":" + docker_info[2] cmd_build = "/kaniko/executor --cache=true --cache-dir=/cache --cleanup --skip-tls-verify --skip-tls-verify-pull --skip-tls-verify-registry" \ " --dockerfile=" + Dockefile_path + \ " --context=dir://" + folder_name + \ " --destination=" + harbor_image_name assert run_shell(cmd_build) == 0, "映象build失敗: " + harbor_image_name if __name__ == "__main__": run_executor()
原文連結:https://developer.aliyun.com/article/792006?spm=a2c6h.12873581.0.0.6b4c767dUO7Yup&groupCode=othertech
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70003733/viewspace-2793464/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Macos自定義Docker Ubuntu映象MacDockerUbuntu
- 使用 Dockerfile 自定義 Nginx 映象DockerNginx
- docker官方mysql映象自定義配置DockerMySql
- Docker自定義映象上傳阿里雲Docker阿里
- 手寫一個自定義PromisePromise
- 自定義一個事件聚合器事件
- cnetos7 ISO 映象自定義製作
- 如何寫好一個自定義ViewView
- 使用 Flutter 自定義一個 ProgressBar - IntervalProgressBarFlutter
- python - 建立一個自定義模組Python
- 【vue】自定義一個websocket工具函式VueWeb函式
- flutter 用 CustomPaint 畫一個自定義的 CircleProgressBar (一)FlutterAI
- docker筆記17-Dockerfile案例-自定義tomcat映象Docker筆記Tomcat
- flutter 如何自定義一個loadmore / 載入更多Flutter
- Simple WPF: WPF自定義一個可以定義步長的SpinBox
- 自定義一個仿拼多多地址選擇器
- 自定義一個下拉重新整理控制元件控制元件
- ##自定義一個自動注入Log 的 外掛
- QT風格(QStyle):繪製一個自定義QComboBoxQT
- 自定義鍵盤(一)
- Docker 入門系列四:Dockerfile-自定義 CentOS7 映象DockerCentOS
- 自定義 OpenShift s2i 映象與模板——OracleJDK8OracleJDK
- Flutter:教你用CustomPaint畫一個自定義的CircleProgressBarFlutterAI
- 自定義一個可以接收空格的字串的函式字串函式
- 【WPF】自定義一個自刪除的多功能ListBox
- 『現學現忘』Docker基礎 — 35、實戰:自定義CentOS映象DockerCentOS
- 如何用 Promise 自定義一個 GET 請求的函式Promise函式
- 快速開發一個自定義 Spring Boot Starter,並使用它Spring Boot
- 如何自定義一個全域性異常捕獲器-SpiderManIDE
- 一個例子帶你瞭解兩種自定義註解
- 自定義一個簡單的載入對話方塊
- GKCycleScrollView - 一個輕量級的自定義輪播圖元件View元件
- Probius:一個功能強大的自定義任務系統
- Vue element下拉框加一個自定義的選項Vue
- apisix~為自定義外掛設計一個configmap指令碼API指令碼
- 如何編寫一個前端框架之六-自定義元素(譯)前端框架
- .Net 7 高階玩法,自定義一個CLR執行時
- 自定義部落格園個人皮膚