我在用于CI的docker设置中有一个docker。本质上,该机器上装有jenkins CI服务器,该服务器使用相同的机器docker套接字为CI创建节点。
直到我最近更新了docker为止,这一直很好。我已经确定了问题,但似乎无法找出正确的方法来使它起作用。
host $ docker exec -it myjenkins bash jenkins@container $ docker ps Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/json: dial unix /var/run/docker.sock: connect: permission denied host $ docker exec -it -u root -it myjenkins bash root@container $ docker ps ... docker ps from host container yay! ...
这就是我的猜测。我可以从容器中访问主机docker套接字,但似乎无法授予jenkins用户许可。
我已经添加了docker组,也将jenkins用户添加到了docker组。但是我仍然遇到同样的错误。我已经重新开始了几次,所以,我对下一步的工作感到茫然。
有没有办法在特定套接字上强制用户权限?
您需要将主机上的docker组的gid映射到jenkins所属容器内的组的gid。这是我的Dockerfile中的示例,说明了如何构建jenkins从属映像:
ARG DOCKER_GID=993 RUN groupadd -g ${DOCKER_GID} docker \ && curl -sSL https://get.docker.com/ | sh \ && apt-get -q autoremove \ && apt-get -q clean -y \ && rm -rf /var/lib/apt/lists/* /var/cache/apt/*.bin RUN useradd -m -d /home/jenkins -s /bin/sh jenkins \ && usermod -aG docker jenkins
在此示例中,993恰好是主机上docker的主键,您可以对其进行调整以匹配您的环境。
OP的解决方案: 如果无法重建,则可以使用root相应地设置docker组并添加用户。如果您尝试过此操作,则可能必须删除从站(groupdel docker)上的组:
groupdel docker
docker exec -it -u root myjenkins bash container $ groupadd -g 993 docker container $ usermod -aG docker jenkins