问题描述
最近一直在测试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