我在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组。
非常感谢任何帮助。感谢
答案 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 visudo
中添加:
%staff ALL = (ALL) ALL
答案 4 :(得分:0)
/var
是macOS中指向/private/var
的符号链接。尝试安装它而不是符号链接。