自定義一個kaniko映象

哈哈哈hh發表於2021-09-24

工具與資源中心

幫助開發者更加高效的工作,提供圍繞開發者全生命週期的工具與資源

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映象的建立。

遇到的難題

  1. kaniko是基於scratch構建的,裡面沒有shell,所以想在kaniko原生映象裡在呼叫python是很麻煩的
  2. kaniko建立docker映象使用的是file system功能,如果想在一個kaniko容器裡先建立ubuntu映象,再建立alpine映象, 是會有各種衝突問題的,需要使用–cleanup功能。此功能會清空檔案系統,同時如果有自己裝的shell,也會被清空,導致無法再次使用

解決方案

  1. kaniko的關鍵檔案其實是/kaniko目錄下的哪些 二進位制檔案,官方推薦是用 gcr.io /kaniko-project/executor 映象,其實我們可以複製這個/kaniko目錄到我們自己的私有映象
  2. shell沒有的話,我們可以複製一個busybox進去,這樣就有shell了
  3. 雖然–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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章