Docker daemon.json 不支持设置挂载默认权限;权限由宿主机文件系统决定或运行时显式指定,仅可通过 userns-remap、default-ulimits、SELinux 标签等间接管控。
docker 本身不通过 daemon.json 控制容器挂载(volume 或 bind mount)的默认文件系统权限,比如 uid、gid、mode 等。这些权限由宿主机文件系统决定,或由运行容器时显式指定(如 --user、:z/:z、:ro、--mount type=bind,chmod=... 等),daemon.json 中没有字段用于设置“挂载默认权限”。
但你可以通过以下几种方式间接影响挂载后容器内文件的可见权限行为,属于生产中常用且安全的做法:
-
使用
userns-remap启用用户命名空间映射
这是最接近“统一管控挂载权限”的守护进程级配置。它让所有容器以非 root 用户身份运行,即使容器内用root,在宿主机上也会映射为普通 UID/GID,从而避免挂载目录被 root 写满或误删。
配置示例:{ "userns-remap": "default" }- 需提前创建
/etc/subuid和/etc/subgid映射条目(如dockremap:100000:65536) - 启用后,
/var/lib/docker下数据自动隔离,bind mount 的宿主机目录也会受该 UID 映射约束(需确保目录对映射 UID 可读写)
- 需提前创建
-
配合
default-ulimits+user运行时约束
虽然不改挂载权限,但可限制容器内进程能力,降低因权限失控导致的问题:{ "default-ulimits": { "nofile": { "Soft": 65536, "Hard": 65536 } }, "userns-remap": "default" } -
不推荐但常见:用
runAsUser/--user在运行时强制指定 UID
这不是 daemon.json 的能力,而是启动容器时的行为。例如:docker run -v /host/data:/app/data --user 1001:1001 nginx
此时容器内
/app/data的属主会是1001:1001,若宿主机/host/data权限宽松(如777),则能正常读写;否则需提前chown 1001:1001 /host/data。 -
SELinux 标签(仅限 SELinux 启用系统)
若系统启用 SELinux,可通过:Z或:z挂载选项自动打标签,实现类型强制访问控制。这也不在 daemon.json 中配置,而是在docker run或docker-compose.yml中写:volumes: - "/host/data:/container/data:Z"
总结来说:
daemon.json 不提供“挂载默认权限”开关。真正可控的是——
✅ 用户命名空间隔离(userns-remap)
✅ 默认 ulimit 与运行时限制
✅ 配合外部机制(如提前 chown、SELinux、Podman-style rootless 模式)
权限问题本质是宿主机文件系统与容器用户空间的对齐,靠单一配置文件无法全自动解决,需结合部署习惯和安全策略设计。


















