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

标签 docker docker-compose

我正在启动一个 Jenkins docker 容器进行CI工作。我使用的主机操作系统是CoreOS。在jenkins容器内,我还安装了docker-cli以便在主机系统中的docker容器上运行build。为了做到这一点,我使用以下配置在映射器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中的权限没有什么神奇的东西:它们的工作就像Docker外部的权限一样。也就是说,如果您希望用户有权访问文件(例如/var/run/docker.sock),则该文件需要由该用户拥有,或者他们必须是相应组的成员,或者需要对该文件的权限允许访问任何人。

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

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

  • 确保主机上的/var/run/docker.sock是组可写的(例如,在主机上创建docker组,并确保该组中的用户可以使用Docker)。
  • docker组的数字组ID作为环境变量传递到容器中。
  • 在您的容器中有一个以root用户身份运行的ENTRYPOINT脚本,该脚本(a)创建一个具有匹配数字gid的组,并且(b)将Jenkins用户修改为该组的成员,然后(c)exec您的docker CMD作为 Jenkins 用户。

  • 因此,您的入口点脚本可能看起来像这样(假设您在$DOCKER_GROUP_ID中传递了docker-compose.yml的值):
    #!/bin/sh
    
    groupadd -g $DOCKER_GROUP_ID docker
    usermod -a -G docker jenkins
    
    exec runuser -u jenkins "$@"
    

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

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

    关于docker - 如何在Docker容器中为非root用户设置卷权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45214891/

    相关文章:

    c# - 两个 docker 容器之间的 Dotnet SSL 错误

    docker - boot2docker/docker "Error. image library/.:latest not found"

    docker - 我可以使用已经存在的 VM 作为 docker-machine 吗?

    visual-studio - visual studio 2017 docker-compose override 和 prod 构建操作

    docker - 我可以使用环境变量让 Celery worker 连接到不同的 worker 吗?

    docker - 我可以引用服务名称 docker-compose.yml

    postgresql - docker部署的postgresql镜像运行了一段时间后无法对spring应用程序进行身份验证

    ruby-on-rails - 为什么我的 Docker PostgreSQL 容器不再运行?

    docker - 如何使用像https://localhost:5001/api/Movies/getname这样的api简单地在.net核心中从container1到container2调用方法

    docker - 如何复制和重命名 Docker 容器?