当组权限似乎正确时,如何修复“拨号 unix /var/run/docker.sock:连接:权限被拒绝”?
Posted
技术标签:
【中文标题】当组权限似乎正确时,如何修复“拨号 unix /var/run/docker.sock:连接:权限被拒绝”?【英文标题】:How to fix "dial unix /var/run/docker.sock: connect: permission denied" when group permissions seem correct? 【发布时间】:2018-12-22 21:05:39 【问题描述】:在更新 Ubuntu 18.04 后我突然遇到问题:以前我在系统上使用 docker 时没有问题,但突然间我不能了。据我所知,权限看起来是正确的:
$ docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.35/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
$ ls -last /var/run/docker.sock
0 srw-rw---- 1 root docker 0 Jul 14 09:10 /var/run/docker.sock
$ whoami
brandon
$ cat /etc/group | grep docker
docker:x:995:brandon
nvidia-docker:x:994:
编辑:
组信息:
$ groups
brandon
$ groups brandon
brandon : brandon adm cdrom sudo dip plugdev games lpadmin sambashare docker
$ whoami
brandon
更新
自从我将系统从 17.04 升级到 18.04 的原始帖子以来,我已经从 16.04 升级到 18.04 进行了两次升级,后来的两个系统都没有出现问题。所以这可能与 17.04 到 18.04 的升级过程有关。我还没有执行全新的 18.04 安装。
【问题讨论】:
运行sudo docker run hello-world
是否有效?
如果您在同一终端运行 newgrp docker
并重试,会发生什么情况?
您可以尝试使用辅助 TTY (Ctrl-Alt-F3) 吗?
Docker can't connect to docker daemon的可能重复
@DavidMaze - 我不这么认为 - 上面的 newgrp
建议有效,通过 ssh
登录系统也是如此
【参考方案1】:
sudo setfacl --modify user:<user name or ID>:rw /var/run/docker.sock
它不需要重新启动,并且比 usermod 或 chown 更安全。
正如@mirekphd 指出的那样,当用户name 仅存在于容器内而不存在于主机上时,用户ID 是必需的。
【讨论】:
谢谢。碰巧的是,我仍然有这个错误的系统,尽管我不确定还有几个月!碰巧,这是可行的。将检查它是否在重新启动时仍然存在。 (重启后似乎不会持续) @bbarker unix.stackexchange.com/questions/372244/… 虽然在许多系统上这是持久的 setfacl -m jenkins:docker:rw /var/run/docker.sock setfacl: 选项 -m: 字符 9 附近的参数无效 @ShacharHamuzimRajuan 您需要为用户运行 setfacl --modify ,例如: setfacl -m u:docker:rw 或 u:jenkins:rw 。或每组(g 而不是 u)。见:linux.die.net/man/1/setfacl【参考方案2】:将用户添加到 docker 组。
sudo usermod -aG docker $USER
sudo reboot
【讨论】:
也许我遗漏了一些东西,但在我的例子中,'groups brandon' 的输出已经包含了 'docker',如上所述。但这通常是个好建议。 重启有帮助:) 创建一个新的用户会话(注销并重新登录)足以更新用户会话组。无需重启。 不用重启,你可以重启docker守护进程sudo systemctl restart docker【参考方案3】:Ubuntu 18:04
sudo setfacl --modify user:$USER:rw /var/run/docker.sock
【讨论】:
【参考方案4】:修复它的方法是运行:
sudo addgroup --system docker
sudo adduser $USER docker
newgrp docker
这对我有用:)
【讨论】:
newgrp docker 是我所遵循的指南中缺少的步骤【参考方案5】:只需尝试通过以下方式授予 docker.sock 文件正确的权限:
sudo chmod 666 /var/run/docker.sock
【讨论】:
这在 Win10 WSL 2 和 Ubuntu 20.04 上对我有用【参考方案6】:不知何故,当我在安装 Docker 后我的 docker.sock 上没有正确的权限时,我发现了这个页面。所以,如果你有同样的问题,你可以阅读这个:
$ sudo adduser $USER docker 不起作用,因为该组是“root” 不是“码头工人”
$ ls -l /var/run/docker.sock srw-rw---- 1 root root 0 Jul 11 09:48 /var/run/docker.sock 所以它应该是 $ sudo adduser $USER root
来自非快照安装的机器,组是“docker”
# ls -l /var/run/docker.sock srw-rw---- 1 root docker 0 Jul 3 04:18 /var/run/docker.sock 正确的做法是,根据docker.help你 必须在 sudo snap install docker 之前运行以下命令
$ sudo addgroup --system docker $ sudo adduser $USER docker $ newgrp docker 那么该组将是“docker”
$ ls -l /var/run/docker.sock srw-rw---- 1 root docker 0 Jul 11 10:59 /var/run/docker.sock
来源:https://github.com/docker-archive/docker-snap/issues/1(是的,第一期:D)
最简单的修复方法是运行:
$ sudo setfacl -m "g:docker:rw" /var/run/docker.sock
然后,正如它已经提到的,为您的用户运行以下命令:
$sudo addgroup --system docker
$sudo adduser $USER docker
$newgrp docker
就是这样 :) 玩得开心!
【讨论】:
【参考方案7】:我做了快速修复,它立即生效。
sudo chmod 777 /var/run/docker.sock
【讨论】:
如果您只是在开发环境中使用 Docker,这可能看起来是一个简单的解决方案,但这对于您的系统安全来说是一个非常糟糕的主意。 sudo setfacl -m user:brandon:rw /var/run/docker.sock 只为一个用户提供所需的权限。 不,不要这样做。 当建议一些不安全的东西时,请写一个警告【参考方案8】:特定于 Ubuntu,lightdm 存在一个已知问题,即作为 GUI 登录的一部分从用户中删除辅助组。您可以在此处关注该问题:https://bugs.launchpad.net/lightdm/+bug/1781418
您可以尝试关闭 lightdm 或应用错误报告中提到的解决方法:
[注释掉 /etc/pam.d/lightdm 中的以下行:]
auth optional pam_kwallet.so auth optional pam_kwallet5.so
临时选项包括使用 ssh 或 su -l
命令或运行 newgrp docker
命令之类的方式登录您的计算机。这些只会影响当前的 shell,并且需要在每个新终端上再次执行。
在这个问题之外,让用户直接访问 docker 套接字(以及因此对主机的 root 访问)的一般命令是:
sudo usermod -aG docker $(id -un) # you can often use $USER in place of the id command
newgrp docker # affects the current shell, logging out should affect all shells
【讨论】:
【参考方案9】:看起来像是权限问题:
sudo addgroup --system docker
sudo adduser $USER docker
newgrp docker
sudo setfacl -m "g:docker:rw" /var/run/docker.sock
【讨论】:
【参考方案10】:我可以在我的 Linux 机器上使用以下命令解决这个问题。
> sudo setfacl --modify user:$USER:rw /var/run/docker.sock
注意:请检查您是否有 sudo 访问权限。否则此命令将失败。
如何查看 sudo 访问权限?
$ whoami
> rahul
$ groups
> useracc
$ groups useracc
> Here you can see sudo and other access details.
【讨论】:
【参考方案11】:我使用以下命令解决了这个问题:
sudo chmod -x /var/run/docker.sock
【讨论】:
【参考方案12】:请注意:不仅组名很重要,而且组的 gid 显然也很重要。 因此,如果主机系统上的 docker 组的 gid 为 995,
cat /etc/group | grep docker
docker:x:995:brandon
你必须确保 docker group 的 gid 您可以将其作为启动脚本的一部分执行,或者只需使用 exec 并手动执行:
groupmod -g 995 docker
希望对来这里的人有所帮助,我花了一段时间才找到这个答案。
【讨论】:
以上是关于当组权限似乎正确时,如何修复“拨号 unix /var/run/docker.sock:连接:权限被拒绝”?的主要内容,如果未能解决你的问题,请参考以下文章
当组归属取决于前一行时,如何在 postgresql 中标记组?
使用终端安装 Parcel Bundler 时如何修复权限错误