如何以非root用户身份从docker容器内部访问/var/run/docker.sock? (MacOS主机)

问题描述 投票:10回答:4

我已经在Mac上安装了docker,一切运行正常。我正在使用Jenkins docker映像并运行它。在将Jenkins用作CI服务器并通过运行docker命令来构建其他映像时,我知道我们必须在运行Jenkins映像时绑定mount /var/run/docker.sock,以便它可以访问docker守护程序。

我做到了,并在Jenkins的容器中安装了Docker CLI。但是,当运行docker ps或任何其他泊坞窗命令时,它将引发错误:

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”用户添加到sudo列表中,但无济于事。

[我发现很少有文章建议将'jenkins'用户添加到'docker'组中,但令我惊讶的是,我在Mac或容器内找不到任何docker组。

非常感谢您的帮助。谢谢

macos docker
4个回答
1
投票

看来发生这种情况的原因很简单: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

然后设置詹金斯用户:

[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套接字,则这些步骤将起作用。虽然,我认为如上所述更改组分配会比较容易。祝你好运:)


Note:使用运行Docker Engine v19.03.2的macOS Mojave v10.14.3执行的所有测试。这似乎并不严重依赖于主机平台,因此我希望它可以在Linux或任何其他类似UNIX的操作系统(包括其他版本的macOS / OSX)上运行。


0
投票

我今天遇到这个问题。原因和解决方法如下:

我已经以docker for mac的身份启动user A,并尝试以user B的身份运行docker命令。

修复:将docker for mac停止为user A,然后将其启动为user B


0
投票

否,但这有效:

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

0
投票

/var是macOS中与/private/var的符号链接。尝试安装它而不是符号链接。

© www.soinside.com 2019 - 2024. All rights reserved.