如何找出哪个用户正在访问 /var/run/docker.sock 会导致权限被拒绝的错误

How to find out which user is accessing /var/run/docker.sock that will cause permission denied error

此题与以下题不同:

Docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock 因为他们没有考虑将 jenkins 安装为 docker 容器,所以这里我没有 jenkins 用户来授予该用户访问该文件的权限。

还有这个 因为我不知道我为哪个用户收到这个错误,这里的用户 root 可以访问这个文件但是错误又发生了。

这是我的问题:

我想 运行 docker jenkinsci/blueocean 图像在 ubuntu 上使用以下命令:

docker container run \
  --name jenkins-blueocean \
  --rm \
  --detach \
  --publish 8181:8080 \
  --publish 50000:50000 \
  --volume jenkins-data:/var/jenkins_home \
  --volume jenkins-docker-certs:/certs/client:ro \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean

运行当我按如下方式使用代理时在 dokcer 容器上安装 jenkins 之后:

agent {
        docker {
            image 'maven:3-alpine'
        }
}

我收到以下错误:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/images/create?fromImage=maven&tag=3-alpine: dial unix /var/run/docker.sock: connect: permission denied

这里当我使用这个命令时它会解决问题:

chmod 777 /var/run/docker.sock

但由于安全漏洞,我不想允许所有用户访问此套接字。

我还应该说当前用户是 root 并且它可以访问 /var/run/docker.sock

这里有一些有用的信息:

echo $USER
root

ls -ls /var/run/docker.sock
srw-rw---- 1 root docker 0 Jul 24 14:56 /var/run/docker.sock

groups
root docker

我应该允许哪个用户访问此文件? jenkins 运行 在容器上,我的系统上没有 jenkins 用户,我如何找出哪个用户正在尝试访问此套接字文件 /var/run/docker.sock 并因此出现此错误?

根据 Jenkins downloading-and-running-jenkins-in-docker 文档:

4.为了在 Jenkins 节点内执行 Docker 命令,下载并 运行 docker:dind

Docker in Docker(dind) 允许 Docker 引擎 运行 作为容器在 Docker - 这是一种感觉很直观的开始。

我刚刚复制并使用这些命令对我来说工作得很好(我还在启动选项中包含 --privileged。不确定它是否是强制性的):

docker container prune -f;
docker container run   --name jenkins-docker     --detach   --privileged   --network jenkins   --network-alias docker   --env DOCKER_TLS_CERTDIR=/certs   --volume jenkins-docker-certs:/certs/client   --volume jenkins-data:/var/jenkins_home   --publish 2376:2376   docker:dind;
docker container run   --name jenkins-blueocean   --rm   --detach  --privileged   --network jenkins   --env DOCKER_HOST=tcp://docker:2376   --env DOCKER_CERT_PATH=/certs/client   --env DOCKER_TLS_VERIFY=1   --publish 8080:8080   --publish 50000:50000   --volume jenkins-data:/var/jenkins_home   --volume jenkins-docker-certs:/certs/client:ro   jenkinsci/blueocean

但是,在dind repo README.md 的最顶部,您可以找到以下强烈反对上述设置的声明(感谢@David指向这个的迷宫):

If you came here because you would like to run a testing system like Jenkins in a container, and want that container to spin up more containers, then please read this blog post first. Thank you!


我个人在家里自己的操场上使用它,我经常在那里擦掉所有东西,风险由我自己承担。

如果您查看 jenkinsci/blueocean 的 Dockerfile,例如 1.23.2。您可以看到“jenkins”用户是 uid 1000 和 gid 1000。必须匹配这些 ID 才能进行卷访问,而不是用户名。

与其在主机上授予 uid/gid 1000 对 /var/run/docker.sock 的访问权限,不如 运行 容器作为具有权限的 user/group 可能更好.您可以使用 id -u rootid -g docker 检查,然后将其与您的 docker run 命令一起使用,例如(假设 root uid 为 0),docker run -u 0 ...。有关如何使用 -u/--user 的更多示例,请参阅 doc page。如果您 运行 在容器中使用与 root 相同的 uid,您可能不会有问题,但如果是不同的 id,您可能 运行 与其他 uid 一样出现问题可能缺少必要的配置才能正确 运行 Jenkins 的东西。

如果你真的想走改变/var/run/docker.sock的路线,那么答案是创建一个gid 1000的组并向其中添加root我猜的组。

This repo 可能包含您问题的解决方案,我最近尝试过,效果很好。 请记住,jenkinsci/blueocean 图像已过时,目前已被 Jenkins 弃用。

如果您更喜欢使用官方 jenkins/jenkins 图片,利用 docker.sock 交流 - 您可以通过将问题发布到 Jenkins Docker packaging and plugin channel 找到解决方案