如何为非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
命令。 你可以使用sudo
或su
或其他类似的命令来完成类似的事情。