--read-only参数可使容器根文件系统全局只读,但需配合--tmpfs挂载/tmp、/run等路径以满足运行时写入需求,与卷的:ro挂载作用层级不同,二者可共存实现分层防护。
直接在 docker run 命令中加上 --read-only 参数,就能让容器的整个根文件系统(rootfs)变为只读状态。这是 docker 提供的原生安全机制,不是靠挂载卷控制,而是作用于容器运行时的最底层文件系统层。
基础用法:启用全局只读根文件系统
执行以下命令即可启动一个根文件系统完全只读的容器:
docker run --read-only -it ubuntu:22.04 /bin/bash
此时容器内所有路径(如 /etc、/usr、/var 等)默认禁止写入。任何尝试创建、修改或删除文件的操作都会报错:Read-only file system。
必须配合 tmpfs 挂载才能正常运行
纯 --read-only 会让大多数服务启动失败,因为程序通常需要写临时文件、PID 文件、日志缓冲或 socket 文件。解决方法是显式挂载 tmpfs 到必要可写路径:
-
--tmpfs /tmp:rw,size=64m:提供可写的内存临时目录 -
--tmpfs /run:rw,size=32m:满足 systemd 或 nginx 等进程存放 runtime 文件的需求 -
--tmpfs /var/run:rw,size=16m:兼容传统 init 脚本习惯路径
完整示例:
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
docker run --read-only --tmpfs /tmp --tmpfs /run -d nginx:alpine
与卷挂载(-v)的 read-only 设置不冲突,但作用层级不同
--read-only 控制的是容器根文件系统本身;而 -v /host:/container:ro 只影响某个挂载点的权限。两者可以共存:
- 根文件系统只读 + 某个 bind mount 卷也设为
:ro:双重防护,配置更严格 - 根文件系统只读 + 某个 volume 设为
:rw:允许向该卷写数据(如日志),但无法修改镜像自带文件
例如:
docker run --read-only -v /logs:/var/log/nginx:rw -v ./conf:/etc/nginx:ro nginx
注意事项和常见问题
启用 --read-only 后需特别注意:
- 不能依赖
/proc/sys写入调优参数(需提前配置或用--sysctl) - 某些镜像内置的健康检查脚本若尝试写临时文件会失败,应改用
curl或nc类无副作用检查 - 使用
docker exec -it进入容器后,仍无法修改只读文件系统中的任何文件,包括/etc/hosts - 如果应用硬编码写入
/var/lib/app等路径,需通过--tmpfs或-v显式覆盖该路径

















