容器里docker登录成功push镜像失败问题踩坑记
近期在做CI集群的迁移,基于阿里云kubernetes服务新建一个k8s集群用于运行gitlab-ci,集群开好了后,通过helm安装好gitlab-runner,然后使用新集群进行测试验证,发现一个头疼的问题,CI里构建好镜像后竟然无法push镜像,提示无权限!错误信息是:
denied: requested access to the resource is denied
开始猜测可能是挂载的Secret的问题,就直接改为账户密码来测试,通过手动创建容器来进行验证,如下:
docker run -d -it -v /var/run/docker.sock:/var/run/docker.sock --name "k8s-demo-1" www.5bug.wang/test/k8s-demo:1.4 /bin/bash
链接到容器里面去后,进行docker login,然后进行docker push,依然失败:
这可就纳闷了,账户密码是对的,而且该账号确认是有权限push的,登录后docker用户会在用户目录下生成一个.docker/config.json的文件,该文件也存在。奇怪的是以前的集群里是完全正常的,所以问题原因应该是出在集群的node节点上了,对比两边集群的node节点的用户权限,和docker版本,用户归属组什么的,终于找到区别的地方了:新集群里的docker程序是归属root账户docker组,老集群里docker程序归属root账户root组。
所以这里就换一种挂载方式,全部使用宿主机里的docker文件,docker启动命令如下:
docker run -d -it -v /var/run/docker.sock:/var/run/docker.sock -v /bin/docker:/usr/bin/docker -v /usr/lib64/libltdl.so.7:/usr/lib64/libltdl.so.7 --name "k8s-demo-1" www.5bug.wang/test/k8s-demo:1.4 /bin/bash
将sock文件、docker二进制文件、docker依赖的so文件一起挂载到容器里,这样执行就解决问题了。
回到CI集群里,修改chart文件,将这三个文件都挂载到CI的容器里后,重新验证,问题解决!