如何在非root用户

时间:2017-07-20 12:34:25

标签: docker docker-compose

我正在为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

1 个答案:

答案 0 :(得分:0)

Docker中的权限并不神奇:它们的工作方式就像Docker之外的权限一样。也就是说,如果您希望用户有权访问文件(如/var/run/docker.sock),则该文件需要由用户拥有,或者他们需要是相应组的成员或权限在文件上需要允许访问任何人。

/var/run/docker.sock公开给非root用户有点棘手,因为典型的解决方案(容器内只有chown / chmod个东西)可能会破坏主机上的内容。

我怀疑最好的解决方案可能是:

  • 确保主机上的/var/run/docker.sock可写入组(例如,在主机上创建docker组,并确保该组中的用户可以使用Docker。)
  • docker组的数字组ID作为环境变量传递到容器中。
  • 在容器中有一个以root身份运行的ENTRYPOINT脚本,(a)创建一个具有匹配数字gid的组,(b)修改Jenkins用户为该组的成员,然后(c){{ 1}}你的docker 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命令。您可以使用runusersudo或其他类似命令来完成类似的操作。