原理
runner支持多種excutor: shell, docker(eg. shell, docker, etc. (default: "docker") )
runner通過調用shell或者token來執行命令,我選用的是docker。通過將/var/run/docker.sock掛載到runner容器內,runner使用unix協議調用docker api,在每個構建階段分別啟動容器來執行構建命令。每個構建階段都是在容器內進行的,這個構建容器不是在runner內部的,而是調用docker api啟動的容器,所以構建容器和runner本身的容器是平行的關系,不是父子關系,在使用時,很容易陷入誤區認為它們是父子關系。
問題
私服中的基礎鏡像的拉取問題
每個構建階段都會使用一個基礎鏡像來啟動容器,當這個基礎鏡像是在私服或者需要登錄才能拉取時,就會出現報錯:
ERROR: Preparation failed: Error response from daemon: unauthorized: unauthorized to access repository: pdp/node, action: pull: unauthorized to access repository: pdp/node, action: pull (docker.go:142:0s)
你可能會認為,未登錄,那我在宿主機登錄不就行了。但其實這不生效,可以試試。
因為調用docker api去創建構建容器的時候,是需要帶鏡像拉取的auth認證的,所以這個認證需要在runner本身容器授予。
方法就是在某一個機器上先登錄
docker login xxx -uxxx -pxxx
然后獲取auth信息
cat ~/.docker/config.json
這時沒問題的話會輸出一個json字符串,然后使用configMap或者config或者普通volume把這個文件掛載進runner的/root/.docker/config.json。重啟runner,再次拉取就發現可以了。同理,在任何需要調用docker api創建容器的容器里面,放置這個文件,就可以拿到認證信息。
還是這個問題,有個坑記錄一下,當config文件的auth不止一個鏡像倉庫的時候,runner僅會獲取到第一個auth,導致第二個auth失效。這時候你就會驚訝的發現,我明明已經設置了auth,但為什么還是無法拉取鏡像,就是這個問題。
