当组权限似乎正确时,如何修复“拨号 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 中标记组?

Bash 脚本未在 Cron 中正确执行

使用终端安装 Parcel Bundler 时如何修复权限错误

将remotebuild与cordova ios一起使用时如何修复丢失的写访问错误?

如何修复错误:mkdir():运行作曲家时权限被拒绝