以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
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