我已经在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组。
非常感谢您的帮助。谢谢
看来发生这种情况的原因很简单: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)上运行。
我今天遇到这个问题。原因和解决方法如下:
我已经以docker for mac
的身份启动user A
,并尝试以user B
的身份运行docker命令。
修复:将docker for mac
停止为user A
,然后将其启动为user B
。
否,但这有效:
jenkins
)添加到staff
组:sudo dseditgroup -o edit -a jenkins -t user staff
sudo visudo
中添加:
%staff ALL = (ALL) ALL
/var
是macOS中与/private/var
的符号链接。尝试安装它而不是符号链接。