Bind Mount 本身不提供白名单机制,必须通过只读挂载+最小化路径、mount propagation裁剪、user namespace权限映射等内核级策略实现运行时逻辑白名单。
bind mount 本身不提供白名单机制,它只是把宿主机目录“原样映射”进容器。要限制容器可触达的范围,必须借助 linux 内核的访问控制能力,在挂载之外叠加隔离策略。
用只读挂载 + 目录最小化实现逻辑白名单
这是最直接、最可靠的方式:只挂载容器真正需要的子路径,并设为只读,避免写入和遍历风险。
- 不要挂载整个 /home/user,而是只挂载具体配置文件或数据目录,例如 /home/user/app/config.yaml
- 加 :ro 后缀强制只读:docker run -v /host/conf.yaml:/app/conf.yaml:ro nginx
- 若需多个文件,可用 bind mount 多次指定,或先打包进镜像——避免挂载大目录后容器通过 .. 上溯遍历
配合 mount propagation 和 bind 重挂载做路径裁剪
在容器启动前,用 --mount 的 bind-propagation 配合宿主机临时重挂载,能实现“可见即所限”。
- 先在宿主机创建一个干净挂载点:mkdir /mnt/safe && mount --bind /host/data/subdir /mnt/safe
- 再用 --mount type=bind,source=/mnt/safe,target=/app/data,readonly 挂入容器
- 这样容器看到的 /app/data 就是裁剪后的视图,无法感知原始父路径
结合 user namespace 和 rootfs overlay 进一步收窄权限
单纯 Bind Mount 是用户态映射,权限仍由宿主机文件系统决定。要真正限制“能打开哪些文件”,需叠加内核级控制:
- 启用 user namespace(--userns-remap),让容器内 root 映射为宿主机普通用户,天然失去对多数系统路径的 open 权限
- 搭配 --read-only 启动容器,再用 --tmpfs 单独放开必要可写路径(如 /tmp),阻断对挂载目录的写操作
- 对敏感挂载点,可在宿主机用 chmod 700 或 ACL 限定仅特定 UID/GID 可访问,容器内用户若未匹配则直接 Permission Denied
不推荐依赖 .dockerignore 或构建时过滤
.dockerignore 只影响镜像构建阶段,对运行时 Bind Mount 完全无效;而 --volumes-from 或 compose 中的 volumes 声明也不具备路径通配过滤能力。所谓“白名单”,必须落在运行时生效的挂载视图或内核权限检查上,不能靠配置文件遮掩。

















