我们在Mac上有docker组吗?

时间:2017-07-29 16:13:08

标签: macos docker

我在Mac上安装了docker,一切运行正常。我正在使用Jenkins docker镜像并运行它。使用Jenkins作为CI服务器并通过运行docker命令构建更多图像时,我发现我们必须在运行Jenkins映像时绑定mount /var/run/docker.sock,以便它可以访问docker守护程序。

我这样做并在Jenkins的容器中安装了docker CLI,但是当运行“docker ps”或任何其他docker命令时,它会抛出以下错误:

尝试在unix上连接到Docker守护程序套接字时获得权限被拒绝:///var/run/docker.sock:获取http://%2Fvar%2Frun%2Fdocker.sock/v1.28/containers/json:拨打unix /var/run/docker.sock:connect:permission拒绝

当我以root用户身份连接到容器时,它可以正常工作。但切换到'jenkins'用户会抛出上述错误。我已经将'jenkins'用户添加到了sudo列表但没有帮助。

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

非常感谢任何帮助。感谢

5 个答案:

答案 0 :(得分: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上的world权限,以允许非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套接字,这些步骤将起作用。虽然,我认为如上所述更改组分配会比较容易。祝你好运:)


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

答案 1 :(得分:1)

我今天得到了这个问题。这是原因和解决方法:

我已将View child = layout.getChildAt(current); child.animate().scaleX(2f).scaleY(2f).setDuration(400).start(); 作为View child = layout.getChildAt(current); child.animate().scaleX(1f).scaleY(1f).setDuration(400).start(); 启动,并尝试将docker命令作为docker for mac运行。

修复:
已将user A停用为user B,并以docker for mac开头。

答案 2 :(得分:1)

添加音量

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

,您将可以访问套接字

答案 3 :(得分:0)

否,但这可行:

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

答案 4 :(得分:0)

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