我正在为CI工作推出一个jenkins docker容器。我使用的主机操作系统是CoreOS。在jenkins容器内部,我还安装了docker-cli,以便在主机系统中的docker容器上运行构建。为了做到这一点,我使用下面的配置在映射器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
答案 0 :(得分:0)
Docker中的权限并不神奇:它们的工作方式就像Docker之外的权限一样。也就是说,如果您希望用户有权访问文件(如/var/run/docker.sock
),则该文件需要由用户拥有,或者他们需要是相应组的成员或权限在文件上需要允许访问任何人。
将/var/run/docker.sock
公开给非root用户有点棘手,因为典型的解决方案(容器内只有chown
/ chmod
个东西)可能会破坏主机上的内容。
我怀疑最好的解决方案可能是:
/var/run/docker.sock
可写入组(例如,在主机上创建docker
组,并确保该组中的用户可以使用Docker。)docker
组的数字组ID作为环境变量传递到容器中。exec
作为jenkins用户。因此,您的入口点脚本可能看起来像这样(假设您在CMD
中传递了$DOCKER_GROUP_ID
的值):
docker-compose.yml
您需要将其复制到您的映像中,并将相应的#!/bin/sh
groupadd -g $DOCKER_GROUP_ID docker
usermod -a -G docker jenkins
exec runuser -u jenkins "$@"
指令添加到Dockerfile中。
您可能没有ENTRYPOINT
命令。您可以使用runuser
或sudo
或其他类似命令来完成类似的操作。