以非root用户身份在docker-container中以jenkins-agent身份运行Docker

时间:2019-01-31 01:39:32

标签: docker jenkins permissions

  

类似问题

     

Dockerfile

FROM  jenkins/jenkins:lts
USER root
RUN apt-get -qq update  && apt-get -qq -y install --no-install-recommends curl
RUN curl -sSL https://get.docker.com/ | sh
RUN usermod -aG docker jenkins
USER jekins

终端命令

docker run -p 8080:8080 -p 50000:50000 \
  -v jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -ti bluebrown/docker-in-jenkins-in-docker /bin/bash

在容器内部

docker image ls

输出

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.39/images/json: dial unix
/var/run/docker.sock: connect: permission denied

当我注释掉dockerfile的最后一行时,以root用户身份运行实例,

# USER jenkins

出于显而易见的原因,我可以毫无问题地访问docker套接字。但是,我认为这不是一个适当的解决方案。这就是为什么我要问是否有人以非root用户身份访问了docker套接字。

2 个答案:

答案 0 :(得分:1)

您已将docker组添加到容器内的Jenkins用户。但是,这不一定可行,因为主机和容器之间用户和组到uid和gid的映射可能不同。通常这不是问题,但是在主机卷和其他绑定装入容器的情况下,文件使用相同的uid / gid以及权限进行映射。因此,在容器内部,除非两个环境之间的gid完全相同,否则docker组将无法访问docker套接字。

有几种解决方案,包括手动传递主机gid作为在容器内部使用的gid。或者,您可以得到主机的指导,并使用硬编码的值构建映像。

我的首选解决方案是以root用户身份启动入口点,修复容器内的docker组以匹配已安装的docker套接字的gid,然后切换到Jenkins用户以启动应用程序。这在可能难以控制uid / gids的开发环境中特别有效。所有的步骤/脚本都在我的仓库中:https://github.com/sudo-bmitch/jenkins-docker

对于受控环境中的生产,我尝试在主机和容器中获取用于装入主机卷的任何内容的标准化uid / gid值。然后,我可以运行没有根入口点步骤的容器。

答案 1 :(得分:0)

在您的dockerfile中,您要为用户jenkins启用docker访问权限,但将其下拉至用户jekins而非jenkins吗?

这只是此页面上的错字吗?

我使用了您所描述的这种方法,并且可以正常工作。