自定義一個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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用 Dockerfile 自定義 Nginx 映象DockerNginx
- Macos自定義Docker Ubuntu映象MacDockerUbuntu
- docker官方mysql映象自定義配置DockerMySql
- 一個自定義函式函式
- 基於官方映象MySQL做自定義業務擴充映象MySql
- 一個可以自定義的ToastAST
- 手寫一個自定義PromisePromise
- 自定義一個事件聚合器事件
- Docker自定義映象上傳阿里雲Docker阿里
- python - 建立一個自定義模組Python
- 使用 Flutter 自定義一個 ProgressBar - IntervalProgressBarFlutter
- 如何寫好一個自定義ViewView
- Java自定義一個字典類(Dictionary)Java
- 自定義一個類載入器
- 一個簡單的自定義Collection
- cnetos7 ISO 映象自定義製作
- 【vue】自定義一個websocket工具函式VueWeb函式
- Android 自定義一個輪播圖Android
- Azure VMSS ---- PowerShell建立自定義映象的VMSS叢集
- docker筆記17-Dockerfile案例-自定義tomcat映象Docker筆記Tomcat
- docker 筆記(基本概念、快速執行、自定義映象)Docker筆記
- 自定義鍵盤(一)
- 自定義一個下拉重新整理控制元件控制元件
- 自定義一個仿拼多多地址選擇器
- flutter 如何自定義一個loadmore / 載入更多Flutter
- ##自定義一個自動注入Log 的 外掛
- 一個用lua編寫的自定義函式函式
- 自定義一個可以動態摺疊的UITAbleViewCellUIView
- 如何自定義一個優雅的ContentProviderIDE
- flutter 用 CustomPaint 畫一個自定義的 CircleProgressBar (一)FlutterAI
- Simple WPF: WPF自定義一個可以定義步長的SpinBox
- Docker 入門系列四:Dockerfile-自定義 CentOS7 映象DockerCentOS
- 自定義 OpenShift s2i 映象與模板——OracleJDK8OracleJDK
- 自定義一個可以接收空格的字串的函式字串函式
- 自定義一個酷炫的提交完成按鈕
- 解決xib自定義tableFooterView一個神奇的bugView
- AngularJS中自定義有關一個表格的DirectiveAngularJS
- 自定義餅狀圖(一)