You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:15:31