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,但为什么还是无法拉取镜像,就是这个问题。

上一篇:docker安装部署gitlab


下一篇:Python应用方向有哪些?