:ro表示容器内挂载路径只读,宿主机文件权限不受影响;它通过VFS层拦截写操作,防止容器内进程修改内容,但不保护宿主机上文件被其他进程篡改。
绑定挂载本身不会让宿主机文件变只读,它控制的是容器内对挂载路径的访问权限。配置 只读模式的目标是防止容器内进程修改挂载进来的内容,而不是保护宿主机原始文件不被其他进程改动——宿主机上的文件权限和所有权仍由宿主机系统决定。
用 :ro 后缀最简单直接
在 docker run 或 docker-compose.yml 中,只要在绑定路径末尾加上 :ro,容器内对应目录就无法写入:
docker run -v ./config:/etc/nginx:ro nginx- Compose 中写成:
volumes:
- ./config:/etc/nginx:ro
这样挂载后,即使容器里用 root 用户执行 echo "test" > /etc/nginx/conf.d/default.conf,也会报错 Read-only file system。
用 --mount 长语法更清晰可控
推荐在脚本或生产环境使用 --mount,语义明确且支持更多选项:
docker run --mount type=bind,source=$(pwd)/config,target=/etc/nginx,readonly nginx- 注意关键词是
readonly(不是read_only),大小写敏感,且不能带等号 - Compose 中对应写法:
volumes:
- type: bind
source: ./config
target: /etc/nginx
read_only: true
只读挂载 ≠ 宿主机文件受保护
需要特别注意:这种只读设置只作用于容器视角。宿主机上该目录依然可以被其他进程、用户或脚本随意修改甚至删除。如果你真正想防止宿主机文件被篡改,得靠操作系统层面的措施,比如:
- 调整宿主机目录权限(
chmod 444或移除写权限) - 用
chown root:root并关闭组/其他用户的写权限 - 启用文件系统级只读挂载(如
mount -o remount,ro /path),但这会影响所有访问者
而 Docker 的 :ro 或 readonly 是轻量、容器粒度的防护,适合隔离配置、证书、静态资源等不希望被运行时覆盖的内容。
验证是否生效
启动容器后,进容器手动测试是最可靠的验证方式:
docker exec -it 容器名 sh-
touch /etc/nginx/test→ 应返回Read-only file system -
ls -ld /etc/nginx→ 权限可能显示为drwxr-xr-x,但写操作仍被内核拦截
这个拦截发生在虚拟文件系统层,跟目录本身的 Linux 权限无关,所以即使容器内用户有写权限,也写不进去。


















