如何在MacOS主机上作为非root用户从docker容器内访问/var/run/docker.sock?

22

我已在Mac上安装了Docker,一切都运行良好。我正在使用Jenkins Docker镜像并运行它。 在使用Jenkins作为CI服务器并通过它运行docker命令来构建其他镜像时,我了解到我们必须在运行Jenkins镜像时绑定/var/run/docker.sock 以便它可以访问docker守护程序。

我做到了,并在Jenkins的容器内安装了docker CLI。 但是在运行docker ps或任何其他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.28/containers/json: dial unix /var/run/docker.sock: connect: permission denied
当我以root用户连接到容器时,它可以正常工作。但是切换到“jenkins”用户会出现上述错误。我已经将“jenkins”用户添加到sudo列表中,但没有帮助。
我发现一些文章建议将“jenkins”用户添加到“docker”组,但令我惊讶的是,在Mac或容器内部都找不到任何docker组。
非常感谢任何帮助。谢谢。

Docker > 文件共享... /var 默认不共享 - OneCricketeer
或者 https://serverfault.com/a/659043 - OneCricketeer
2
虽然不太酷,但修改 /var/run/docker.sock 的权限解决了问题。我已经为 Jenkins 用户提供了适当的权限以访问 /var/run/docker.sock 文件,并且它可以正常工作了。 - Neeraj Mishra
嘿,Neeraj,你在 /var/run/docker.sock 上执行了 chmod 吗? - Tibin Paul
@TibinPaul,是的。我不得不为我的用户提供对 /var/run/docker.sock 的权限。 - Neeraj Mishra
2个回答

6

看起来发生这种情况的原因很简单:UNIX权限不允许jenkins用户读取/var/run/docker.sock文件。最简单的解决方案是将/var/run/docker.sock文件的组分配从root更改为另一个组,然后将jenkins添加到该组中:

[as root, inside the container]
root@host:/# usermod -G docker jenkins
root@host:/# chgrp docker /var/run/docker.sock

这当然假设您已经安装了docker CLI,并且存在一个名为docker的用户组。如果没有:

[as root, inside the container]
root@host:/# groupadd docker

另外,您可以更改 /var/run/docker.sock 的全局权限,以允许非根用户访问该套接字,但我不建议这样做;这似乎只是一种糟糕的安全实践。类似地,您可以将套接字直接chown给用户 jenkins,但我更愿意只更改组设置。
我对为什么使用sudo无法正常工作感到困惑。我刚才尝试了我认为与您描述的设置完全相同的操作,并且没有出现任何问题。
启动容器:
[on macos host]
darkstar:~$ docker run \
                  -v /var/run/docker.sock:/var/run/docker.sock \  
                  docker.io/jenkins/jenkins:lts
darkstar:~$ docker exec -u root -it <container id> /bin/bash

安装Docker CLI:
[as root, inside container]
root@host:/# apt-get update
root@host:/# apt-get -y install apt-transport-https \
                                ca-certificates \
                                curl \
                                gnupg2 \
                                software-properties-common
root@host:/# rel_id=$(. /etc/os-release; echo "$ID")
root@host:/# curl -fsSL https://download.docker.com/linux/${rel_id}/gpg > /tmp/dkey
root@host:/# apt-key add /tmp/dkey
root@host:/# add-apt-repository \
             "deb [arch=amd64] https://download.docker.com/linux/${rel_id} \
              $(lsb_release -cs) stable"
root@host:/# apt-get update
root@host:/# apt-get -y install docker-ce

接下来设置Jenkins用户:

[as root, inside container]
root@host:/# usermod -G sudo jenkins
root@host:/# passwd jenkins
[...]

尝试使用:

[as jenkins, inside container]
jenkins@host:/$ sudo docker ps -a
[...]
password for jenkins:

CONTAINER ID        IMAGE                 COMMAND                  CREATED     ...
69340bc13bb2        jenkins/jenkins:lts   "/sbin/tini -- /usr/…"   8 minutes ago ...

我看起来很正常。也许你采用了不同的方法安装Docker CLI? 不确定,但如果你想使用sudo访问docker套接字,这些步骤会起作用。尽管如此,我认为按照上面的说明更改组分配会更容易。祝你好运 :)
注意:所有测试均在运行Docker Engine v19.03.2的macOS Mojave v10.14.3上进行。这似乎并不严重依赖于主机平台,因此我希望它能在Linux或任何其他类UNIX操作系统上工作,包括其他版本的macOS/OSX。

你意识到我们正在使用MacOSX吗? - Dimitri Kopriwa
@DimitriKopriwa 我在我的Macbook Pro上运行了这个程序。我想从技术上讲,我使用的是macOS而不是OSX(因为苹果公司重新品牌了它),但这应该没有什么区别。这个问题似乎与容器内部的设置有关,而不是主机操作系统。 - Z4-tier
1
我在测试平台上添加了一个注释。也许我有一些误解,但是对我来说听起来是这样的:OSX被用作主机系统,在docker容器中运行Jenkins CI构建服务器。Jenkins服务器需要能够控制OSX主机上其他容器的供应,但是从其自己的容器内部进行(因此绑定挂载/var/run/docker.sock)。在容器内向jenkins用户授予对该套接字的访问权限存在一些困难。如果我理解正确,那么这个答案应该是解决方案。如果我漏掉了什么,请告诉我。 - Z4-tier
我甚至没有运行一个 Docker 容器,我的问题是在 MacOSx 上让另一个用户能够使用 docker,而不是 root 用户,无法让容器内的用户访问 docker 套接字。但我承认,这个问题一半是我的问题,一半是容器内的问题。即使我仍然不能在 MacOSx 上以非 root 用户身份使用 docker cli,我也会接受你的答案并给你奖励。 - Dimitri Kopriwa
这是一个问题,因为它在容器外创建了一个组权限问题......如果你在容器内将组设置为docker,那么你就会失去对容器外docker.sock的访问权......srw-rw---- 1 root systemd-coredump 0 Feb 10 01:14 /var/run/docker.sock - eco
显示剩余3条评论

-1

不是,但这个方法可以:

  • 将用户(例如jenkins)添加到staff组中:sudo dseditgroup -o edit -a jenkins -t user staff
  • 允许组使用sudo,在sudo visudo中添加: %staff ALL = (ALL) ALL

2
这个打破了系统权限,员工不是管理员,也不应该是。 - Dimitri Kopriwa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接