Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以jenkins代理的身份在Docker容器中以非root用户的身份运行Docker_Docker_Jenkins_Permissions - Fatal编程技术网

以jenkins代理的身份在Docker容器中以非root用户的身份运行Docker

以jenkins代理的身份在Docker容器中以非root用户的身份运行Docker,docker,jenkins,permissions,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

模拟问题

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用户身份运行实例


出于显而易见的原因,我可以访问docker套接字而不会出现问题。然而,我认为这不是一个适当的解决办法。这就是为什么我想询问是否有人以非root用户身份访问docker套接字。

您已将docker组添加到容器内的Jenkins用户。但是,这不一定有效,因为在主机和容器之间,用户和组到UID和GID的映射可能不同。这通常不是问题,但当主机卷和其他绑定装载到容器中时,这些文件将使用相同的uid/gid和权限进行映射。因此,在容器内部,docker组将无法访问docker套接字,除非两个环境之间的gid恰好相同

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

我的首选解决方案是以root用户身份启动入口点,将容器内的docker组修复为与安装的docker套接字的gid匹配,然后切换到Jenkins用户以启动应用程序。这在uid/GID难以控制的开发环境中尤其有效。这方面的所有步骤/脚本都在my repo中:


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

在docker文件中,您正在为用户jenkins启用docker访问,但会将访问权下放给用户jekins而不是jenkins

这只是这一页上的打字错误吗


正如您所描述的,我使用这种方法,并且它工作正常

我敢肯定这个问题已经被回答了好几次,包括在你链接的问题中。我比较喜欢的方法是:也许你是对的。我想我从未见过你的答案。
# USER jenkins