Rootless Docker:容器内非root用户主机卷写入权限异常问题
解决方案:Rootless Docker下挂载卷的非root用户权限问题
问题原因
Rootless Docker默认启用用户命名空间隔离,会将主机当前运行Docker的用户的UID/GID映射到容器内的root(UID 0),而主机上其他自定义UID/GID(如你的1099、1015)在容器内会被映射为未分配的ID,显示为nobody,导致权限不匹配。Rootful Docker无此隔离机制,因此UID/GID直接对应,权限表现正常。
解决步骤
1. 确认主机用户信息
先获取运行Rootless Docker的当前用户UID/GID:
id -u # 输出当前用户UID,示例值:1000 id -g # 输出当前用户GID,示例值:1000
2. 创建用户级Docker配置文件
Rootless Docker的配置文件位于用户家目录下,而非系统级的/etc/docker/daemon.json。创建并编辑配置文件:
mkdir -p ~/.config/docker nano ~/.config/docker/daemon.json
填入以下配置(替换1000为你的当前用户UID/GID):
{ "uidmap": [ {"hostuid": 1000, "containeruid": 0, "size": 1}, {"hostuid": 1099, "containeruid": 1099, "size": 1} ], "gidmap": [ {"hostgid": 1000, "containergid": 0, "size": 1}, {"hostgid": 1015, "containergid": 1015, "size": 1} ] }
该配置实现:
- 主机当前用户UID/GID映射到容器内root(UID 0)
- 主机
nonrootuser1(UID1099)和nonrootgroup1(GID1015)直接映射到容器内相同ID
3. 赋予Rootless用户主机目录访问权限
Rootless Docker进程以当前用户身份运行,需要能访问主机的/var/osquery/sock目录:
sudo setfacl -m u:$(whoami):rwx /var/osquery/sock
4. 重启Rootless Docker服务
systemctl --user restart docker
5. 验证修复
重新运行容器并检查权限:
docker run --rm -d --name sample-app -v /var/osquery/sock:/var/osquery/sock $(docker build . -q) docker exec sample-app ls -lah /var/osquery/sock
此时应看到目录组所有者为nonrootgroup1,容器内用户可正常写入挂载目录。
额外说明
- 无需配置系统级
userns-remap,Rootless Docker默认已启用用户命名空间,仅需调整用户级的UID/GID映射即可。 - 若主机目录需持续让容器用户写入,可保留
setfacl权限,或直接将当前用户加入nonrootgroup1组:sudo usermod -aG nonrootgroup1 $(whoami)
内容的提问来源于stack exchange,提问作者Dmytro Liakhov
相关产品推荐
相关产品推荐

