Docker 报 Got permission denied while trying to connect to the Docker daemon socket 怎么修复?
先核对实际 context 和 socket;原生 Linux rootful 的组权限问题可加 docker 组并重新登录。~/.docker 属主错误需另行确认,不是所有 sudo 使用都要修复。
若连接的是原生Linux rootful Docker的组受控Unix socket,常见修复为:把当前用户加入 docker 组——sudo usermod -aG docker $USER,然后注销重新登录**(或 newgrp docker),之后 docker 命令免 sudo。如果以前一直用 sudo docker,还可能要顺手修复 ~/.docker/ 目录的属主问题。**
完整步骤
# 1. 确保 docker 组存在(报已存在则跳过)
sudo groupadd docker
# 2. 加入当前用户
sudo usermod -aG docker $USER
# 3. 生效:注销重登,或当前终端先顶一下
newgrp docker
# 4. 验证
docker version # 先验证服务端连接,不依赖镜像仓库下载
原理一句话
常见rootful配置的 /var/run/docker.sock 属主为 root:docker、权限 660——组内用户可读可写,组外用户一律 permission denied。
隐藏坑:~/.docker 属主被 sudo 污染
之前长期 sudo docker ... 会在你的 HOME 下生成 root 属主的配置目录,加组后可能报新错误:
WARNING: Error loading config file: /home/you/.docker/config.json ...
permission denied
修复:
sudo chown -R "$(id -u):$(id -g)" "$HOME/.docker"
# 按实际文件权限最小化修复,不向组递归开放读写执行
不想加组的替代
- 每次
sudo docker ...(脚本里注意环境差异) - rootless 模式 Docker:普通用户跑自己的守护进程,隔离更彻底
安全提醒
docker 组成员等价于 root(可挂载宿主机根目录读写任意文件)。共享服务器/CI 节点上加组要控制名单,审计组内成员:
getent group docker
常见问题(FAQ)
Q:newgrp 后当前终端好了,新开终端又不行?
A:组信息在登录时载入,彻底注销重登才对所有会话生效;桌面环境要重登图形会话。
Q:su - 切换的用户也报权限错?
A:su - user 新会话会重新载组信息,应在新会话用id检查实际进程组,并确认连接的socket/context;登录shell与组加载不能简单用有无-一概判断。
Q:CI 脚本里怎么免 sudo?
A:CI runner 的运行用户加进 docker 组后重启 runner 服务,服务文件里也可显式 SupplementaryGroups=docker。