如何为非root用户设置docker容器中的卷权限

我正在为CI工作推出一个jenkinsdocker集装箱。 而我使用的主机操作系统是CoreOS。 在jenkins容器中,我还安装了docker-cli以便在主机系统上运行Docker容器。 为了做到这一点,我使用下面的configuration在映射器Docker套接字的jenkins容器上挂载/var/run

 volumes: - /jenkins/data:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock:rw 

当我启动容器并运行docker命令时,出现以下错误:

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

/var/run是root权限,但是我的用户是jenkins 。 我怎样才能解决权限问题,让jenkins用户通过映射程序套接字使用docker命令?

我已经尝试下面的命令,但容器不允许我运行sudo

 $ sudo usermod -a -G docker jenkins We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. sudo: no tty present and no askpass program specified 

在Docker中没有任何关于权限的神奇function:它们像Docker之外的权限一样工作。 也就是说,如果你想要一个用户访问一个文件(比如/var/run/docker.sock ),那么这个文件需要由用户拥有,或者他们需要成为相应组的成员,或者文件上的权限需要允许访问任何人。

/var/run/docker.sock暴露给非root用户有点棘手,因为典型的解决scheme(只是从容器中chown / chmod东西)可能会破坏主机上的东西。

我怀疑最好的解决办法可能是:

  • 确保主机上的/var/run/docker.sock是可写组的(例如,在主机上创build一个docker组,并确保该组中的用户可以使用Docker)。
  • docker组的数字组标识作为环境variables传递到容器中。
  • (a)创build一个具有匹配的数字gid的组,并(b)修改Jenkins用户成为该组的成员,然后(c)将您的docker CMD作为jenkins用户。

所以,你的入口点脚本可能看起来像这样(假设你已经在$DOCKER_GROUP_ID docker-compose.yml传入了$DOCKER_GROUP_ID的值):

 #!/bin/sh groupadd -g $DOCKER_GROUP_ID docker usermod -a -G docker jenkins exec runuser -u jenkins "$@" 

您需要将其复制到您的映像中,并将适当的ENTRYPOINT指令添加到Dockerfile中。

您可能没有runuser命令。 你可以使用sudosu或其他类似的命令来完成类似的事情。