我正在启动一个 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作为环境变量传递到容器中。 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
命令。您可以使用sudo
或su
或其他类似命令来完成类似的操作。
关于docker - 如何在Docker容器中为非root用户设置卷权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45214891/