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,但为什么还是无法拉取镜像,就是这个问题。
标签:容器,runner,gitlab,auth,拉取,之坑,镜像,docker 来源: https://www.cnblogs.com/xiaojiluben/p/15931149.html