Docker-in-Docker环境下,非sudo的admin用户无法访问Docker的问题
解决Docker-in-Docker环境中普通用户无需sudo访问Docker的问题
这个问题我碰到过好几次,尤其是在DinD环境里,光把用户加入docker组有时候确实不够,咱们一步步排查解决:
1. 确保组权限立即生效
执行sudo usermod -a -G docker admin后,当前会话不会立即加载新的组权限,这是最常见的坑。你可以做下面其中一件事:
- 完全退出当前终端会话,重新用admin用户登录
- 在当前会话中执行
newgrp docker临时刷新组权限(这个命令会新开一个子shell,生效范围仅限这个子shell) - 验证是否生效:执行
groups或者id,看输出里有没有docker组
2. 检查Docker Socket的权限配置
DinD环境中,宿主机的/var/run/docker.sock挂载到容器内后,权限可能和本地环境不一致。执行下面的命令查看socket的权限:
ls -l /var/run/docker.sock
正常情况下,输出应该类似:
srw-rw---- 1 root docker 0 Aug 20 10:00 /var/run/docker.sock
如果所属组不是docker,或者权限不是rw-rw----,执行下面的命令修复:
sudo chown root:docker /var/run/docker.sock sudo chmod 660 /var/run/docker.sock
3. 适配DinD环境的组ID匹配问题
有时候宿主机的docker组ID和容器内的docker组ID不匹配,这会导致即使你把admin加入容器内的docker组,也没有权限访问socket。解决方法:
- 先在宿主机上查看docker组的ID:
getent group docker | cut -d: -f3
假设输出是999
2. 在容器内,把docker组的ID修改为宿主机的ID(替换成你实际的ID):
sudo groupmod -g 999 docker
或者在启动DinD容器的时候,直接添加宿主机的docker组ID:
docker run -v /var/run/docker.sock:/var/run/docker.sock --group-add=999 ...
4. 验证是否解决问题
完成上面的步骤后,执行docker images测试,如果还是报错,再检查一下:
- 你是否真的用admin用户执行命令(别不小心还是root用户)
- 容器内的admin用户是否真的在docker组里(
id admin确认)
内容的提问来源于stack exchange,提问作者UserASR
相关产品推荐
相关产品推荐

