【问题标题】:How to access /var/run/docker.sock from inside a docker container as a non-root user? (MacOS Host)如何以非 root 用户身份从 docker 容器内部访问 /var/run/docker.sock? (MacOS 主机)
【发布时间】:2018-01-05 13:55:02
【问题描述】:

我已经在 Mac 上安装了 docker,一切运行良好。我正在使用 Jenkins docker 映像并运行它。在使用 Jenkins 作为 CI 服务器并通过运行 docker 命令来构建更多镜像时,我知道我们必须在运行 Jenkins 镜像时绑定 mount /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 默认不共享
  • 虽然不是很酷但是修改 /var/run/docker.sock 的权限解决了这个问题。我已经向 jenkins 用户提供了对 /var/run/docker.sock 文件的适当权限,并且它运行良好。
  • 嘿 Neeraj,你在 /var/run/docker.sock 上做过 chmod 吗?
  • @TibinPaul,是的。我必须向我的用户提供 /var/run/docker.sock 的权限。

标签: macos docker


【解决方案1】:

不,但这有效:

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

【讨论】:

  • 这打破了系统权限,员工不是管理员也不应该是。
【解决方案2】:

看起来发生这种情况的原因很简单: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 上的世界权限以允许非root 用户访问套接字,但我不建议这样做;这似乎是一种糟糕的安全做法。同样,您可以直接将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 上吗?
  • @DimitriKopriwa 我在我的 Macbook Pro 上运行了这个。我想从技术上讲,我使用的是 macOS 而不是 OSX(因为 Apple 重新命名了它),但它不应该有所作为。此问题似乎与容器内的设置有关,而不是与主机操作系统上的设置有关。
  • 我在测试平台上添加了注释。也许我误解了,但在我看来是这样的:OSX 被用作主机系统,在 docker 容器内运行 Jenkins CI 构建服务器。 Jenkins 服务器需要能够控制 OSX 主机上其他容器的配置,但要从它自己的容器内(因此绑定安装 /var/run/docker.sock)。向jenkins 用户授予对容器内该套接字的访问权限存在一些困难。如果这是正确的,那么这个答案应该是解决方案。如果我遗漏了什么,请告诉我。
  • 我什至没有运行单个 docker 容器,我的问题是除了 root 之外的另一个用户能够在 MacOSx 上使用 docker,无法让容器内的用户访问 docker 套接字.但我承认,这个问题一半是我的,一半是在 docker 容器中。即使我在没有root 的情况下仍然无法在我的 MacOSx 中使用 docker cli,我也会接受你的回答并给你赏金。
  • @DimitriKopriwa 这听起来很奇怪。您使用的是 Docker Desktop,还是更旧的东西(即 Docker Toolkit)?我正在使用 Docker Desktop,我没有这个问题。如果可以的话,也许可以尝试卸载您当前使用的任何东西,然后尝试最新的 Docker Desktop。确保您没有安装版本 4.3.30 之前的 VirtualBox,并确保取消设置可能由旧安装设置的任何 DOCKER_* 环境变量。切换到 Docker Desktop 时,这两者都可能导致问题。如果问题仍然存在,您可能想提出一个新问题。
猜你喜欢
  • 2018-06-18
  • 2019-10-16
  • 2017-12-13
  • 2017-08-13
  • 2019-04-05
  • 1970-01-01
  • 2020-12-19
  • 2022-10-13
  • 2019-08-19
相关资源
最近更新 更多