如何为Docker容器授予/dev/kvm设备权限且不修改宿主机权限、不出现共享卷权限混乱
解决方案
1. 解决/dev/kvm设备访问权限问题
提供两种合规方案,按需选择:
方案一:无需开启特权模式(推荐)
权限问题的核心是宿主机/dev/kvm的访问权限归属GID为kvm的组,只要让容器内的运行用户加入对应GID的用户组即可,无需修改宿主机设备权限:
- 第一步:先在宿主机执行命令查询kvm组的GID:
假设返回值为getent group kvm | cut -d: -f3109,后续操作都用这个数值。 - 第二步:配置容器启动参数,给运行用户追加该GID的组权限,两种实现方式:
- 方式1:在
docker run命令中直接加参数:--group-add 109 - 方式2:如果用VS Code Remote Containers,直接在
devcontainer.json的runArgs配置项中追加该参数:"runArgs": [ "--device", "/dev/kvm", "--device", "/dev/dri:/dev/dri", "-v", "/tmp/.X11-unix:/tmp/.X11-unix", "-e", "DISPLAY", "--group-add", "109" // 替换为你自己查询到的kvm组GID ]
- 方式1:在
方案二:开启特权模式(适合本地开发场景)
如果接受开启特权权限,直接在docker run参数或者devcontainer.json的runArgs中追加--privileged即可,该参数会给容器开放所有宿主机设备的访问权限,不需要额外配置组权限。
2. 解决共享卷文件权限混乱问题
问题根源是容器内操作用户的UID/GID和宿主机当前用户的UID/GID不匹配,VS Code Remote Containers有原生适配方案:
- 在
devcontainer.json中添加如下配置即可:
VS Code启动容器时会自动将容器内默认的"remoteUser": "vscode"vscode用户的UID/GID,修改为和宿主机挂载目录所有者(也就是你宿主机的当前用户)的UID/GID完全一致,此时在容器内创建的文件,宿主机用户可以正常访问。 - 如果是手动执行
docker run,可以追加参数指定运行用户的UID/GID和宿主机当前用户一致:-u $(id -u):$(id -g)
最后操作
记得恢复宿主机/dev/kvm的原有权限,执行命令:
sudo chmod 660 /dev/kvm
内容的提问来源于stack exchange,提问作者Diego ROJAS
相关产品推荐
相关产品推荐

