gitlab-runner之坑


原理

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,但為什么還是無法拉取鏡像,就是這個問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM