当组权限看起来正确时,如何修复“拨号unix /var/run/docker.sock:连接:权限被拒绝”的问题?

185

最近我更新了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安装。


2
如果您运行 sudo docker run hello-world,它是否有效? - mviereck
4
如果你在同一个终端中运行newgrp docker,然后再次尝试,会发生什么? - BMitch
1
你可以尝试使用你的次要TTY(Ctrl-Alt-F3)吗? - sachav
1
可能是Docker无法连接到Docker守护程序的重复问题。 - David Maze
1
@DavidMaze - 我不这么认为 - 上面的 newgrp 建议起作用了,通过 ssh 登录系统也可以。 - bbarker
显示剩余7条评论
15个回答

337
sudo setfacl --modify user:<user name or ID>:rw /var/run/docker.sock

它不需要重启,比usermod或chown更安全。

正如@mirekphd所指出的,当用户名称仅存在于容器内而不在主机上时,需要用户ID。


6
似乎无法在重新启动后保留。 - bbarker
1
@bbarker https://unix.stackexchange.com/questions/372244/how-can-i-make-acl-settings-on-run-media-persistent 尽管在许多系统上这是持久的,但我该如何使run / media上的ACL设置持久化? - Nahshon paz
1
setfacl -m jenkins:docker:rw /var/run/docker.socksetfacl:选项-m:字符9附近的参数无效 - Shahar Hamuzim Rajuan
1
@ShacharHamuzimRajuan 你需要运行 setfacl --modify 命令来为一个用户设置权限,例如:setfacl -m u:docker:rw 或者 u:jenkins:rw。或者针对一个组(使用 g 而不是 u)。请参考: https://linux.die.net/man/1/setfacl - Nahshon paz
2
为什么我要使用这个而不是将用户添加到docker组?这似乎是一个短视的试错修复。如果有其他必要的权限,则docker组可能是用于此目的的。权限对于docker组来说应该是足够的,因此应该将要使用docker的用户作为docker组的一部分。仅针对此用户和一个socket文件进行修复可能会导致现在或将来在其他文件上出现更多问题。 - Kissaki
显示剩余8条评论

122

将用户添加到docker组中。

sudo usermod -aG docker $USER
sudo reboot

5
也许我漏掉了什么,但是我的“groups brandon”的输出已经包括了“docker”,就像上面所示的那样。但这通常是一个不错的建议。 - bbarker
5
重启有帮助 :) - digz6666
21
创建一个新用户会话(注销并重新登录)就足以更新用户会话组。无需重新启动计算机。 - Kissaki
3
不必重新启动计算机,您只需重启Docker守护进程sudo systemctl restart docker即可。 - martyglaubitz
1
重启Docker守护进程并注销/登录并不能解决我的问题,只有重启电脑才行。 - craq
如果在WSL上,关闭它,并从PowerShell中运行“wsl --shutdown”以完全关闭WSL。 - Chris Collett

91

尝试通过以下方式为docker.sock文件授予正确的权限:

sudo chmod 666 /var/run/docker.sock

6
这对我在Win10 WSL 2和Ubuntu 20.04上的操作有效。 - pmko
4
这对我在Ubuntu 20.04.2 LTS上起作用。 - Vishrant
1
神奇的是,在Ubuntu服务器上,这对我起作用了。 - Markiian Benovskyi
5
这在 Ubuntu 22.04.1 LTS 上可以运行。 - orb
3
请注意,这将允许系统上的任何用户控制Docker。如果您有一个多用户系统,这可能不是您想要的。 - paul
显示剩余3条评论

32

修复它的方法是运行:

sudo addgroup --system docker
sudo adduser $USER docker
newgrp docker

对我而言没问题 :)


8
在我遵循指南时,"newgrp docker" 这一步骤是缺失的。 - van

21

Ubuntu 18.04

sudo setfacl --modify user:$USER:rw /var/run/docker.sock

1
那是做什么的? - Kris

10

看起来是权限问题:

sudo addgroup --system docker
sudo adduser $USER docker
newgrp docker
sudo setfacl -m "g:docker:rw" /var/run/docker.sock

或者直接使用以下命令,可以解决此问题。

sudo chmod -x /var/run/docker.sock

7

当我安装完Docker后,我的docker.sock没有正确的权限,导致我找到了这个页面。如果你有同样的问题,可以阅读以下内容:

$ sudo adduser $USER docker不起作用,因为组是"root"而不是"docke"

$ ls -l /var/run/docker.sock srw-rw---- 1 root root 0 Jul 11 09:48 /var/run/docker.sock 所以应该运行 $ sudo adduser $USER root

在非snap安装的机器上,组名是"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

好的 :) 祝你玩得开心!


6

我进行了简单的修复,立刻生效。

sudo chmod 777 /var/run/docker.sock

27
如果你只是在开发环境中尝试 Docker,这看起来可能是一个简单的解决方案,但这对于系统安全来说是一个非常糟糕的想法。 - yoann-h
2
sudo setfacl -m user:brandon:rw /var/run/docker.sock 只授予一个用户所需的权限。 - Nahshon paz
4
不,不要这样做。 - Afshin Mehrabani
3
当您建议一些不安全的内容时,请写上警告。 - medic17

4

针对 Ubuntu 20.04

步骤1:检查 Ubuntu 用户

echo $USER

步骤2:给docker赋予rw权限

sudo setfacl --modify user:<user_name>:rw /var/run/docker.sock

示例

出现错误

enter image description here

解决方案

enter image description here

enter image description here


2
我能够在我的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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接