問題描述
最近一直在測試GitLab下的Runner,並在其下實現CI,其中遇到Docker Image編譯後推送到Gitlab的容器中心失敗的問題.
在容器內執行完Docker鏡像的編譯後,自動推送到註冊中心時,報如下錯誤:
c2bf021f0c8d: Layer already exists
cd7100a72410: Layer already exists
dcf1253999b2: Pushed
a7e843cd55f6: Pushed
4fef4efdeb56: Pushed
unauthorized: authentication required
ERROR: Job failed: exit code 1
解決問題
問題排查
-
最初因爲另一項目,有過成功的例子,所以一直將問題聚焦在
Dockerfile
上,可是後來本地編譯成功,並且推送成功。 -
不得不講目標轉移到
gitlab-ci.yml
的內容上;一步步調試,編譯都沒問題,一直都是最後Push時出現問題。 -
根據提示是
unauthorized
認證問題,部分資料顯示是前置行文的docker login
有問題,在將cat ~/.docker/config.json
文件打印調試後,發現問題也不在登陸上。 -
接着排查,又有資料顯示是nginx轉發註冊中心端口時的問題,提到http和https的問題:指登陸時走https,而推送鏡像時走http。爲此,又將gitlab重新配置了一番,幸好我是採用docker-compose的方式搭建的,否則太麻煩了。
-
爲了解決問題,我是換了各種關鍵詞,百度谷歌無所不用。最後終於找到靠譜的問題記錄,說是認證問題是由於授權Token失效的問題,因爲官方推薦在
CI
中使用環境變量的方式登錄,並推薦:"$CI_REGISTRY_USER" 和 "$CI_REGISTRY_PASSWORD"
問題解決
通過下面的操作路徑,將容器註冊中心的授權有效期改爲50
即可
admin >> application_settings >> Container Registry
unauthorized: authentication required on docker push to a different repo