不该写的目录就锁上
给挂载加只读后缀,容器内进程即使被入侵也无法改写这部分内容。配置目录、静态资源、只提供给读取方的共享数据都适合这样处理,成本低而效果直接。写法有两种:简写形式在挂载路径后加 :ro,长格式用 --mount 并把 readonly 作为选项写出来。需要注意的是它只约束挂载点本身,容器其余目录的写权限不受影响。
基本信息
| 简写 | -v 卷名:/容器内路径:ro |
|---|---|
| 长格式 | --mount type=bind,source=宿主路径,target=/容器内路径,readonly |
| 适用对象 | 配置、静态资源、共享数据的读取方 |
| 验证 | 容器内对挂载点执行 touch 应失败 |
典型使用场景
- 配置只读:防止运行期被误改,也阻断被篡改后写回的可能
- 静态资源只读:前端产物挂进 web 容器只供读取
- 共享卷读侧加固:写权限只留给真正需要的那个容器
- 敏感凭据目录:只读挂载避免应用反向写入或覆盖
- 滚动更新前验证:确认应用确实没有依赖写配置文件的行为
只读挂载与验证
只读挂载与验证
# 配置目录以只读方式挂载
docker run -d --name api -v appconfig:/etc/app:ro app/api:1.4.2
# 长格式写法,语义更明确
# docker run --mount type=bind,source=/srv/static,target=/usr/share/nginx/html,readonly nginx:1.27-alpine
# 容器内验证挂载点不可写
docker exec api sh -c 'echo x > /etc/app/probe' || echo 'readonly ok'
# 核对挂载属性
docker inspect -f '{{json .Mounts}}' api写入权限对照
| 写法 | 可读 | 可写 |
|---|---|---|
| -v 卷:/data | 是 | 是 |
| -v 卷:/data:ro | 是 | 否 |
| --mount …,readonly | 是 | 否 |
| tmpfs 挂载 | 是 | 是,写在内存里,停止即消失 |
只读挂载是部署侧最省力的约束手段,与非 root 用户运行、只读根文件系统叠加使用,效果更完整。
只读不会阻止进程读取内容,敏感信息放在只读卷里仍是可读的,权限控制要结合运行用户一并设计。
判断某个挂载是否真的只读,除了读 inspect 的 Mounts 字段,更直接的办法是在容器里对该路径执行一次写操作,看返回的报错是否指向只读文件系统。