吾八哥博客

您现在的位置是:首页 > 云原生 > Docker > 正文

Docker

容器里docker登录成功push镜像失败问题踩坑记

吾八哥2020-05-30Docker4107

近期在做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,依然失败:

企业微信截图_52333396-e482-4e4a-98c0-0be57ec3945f.png

这可就纳闷了,账户密码是对的,而且该账号确认是有权限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的容器里后,重新验证,问题解决!