Docker启动容器报错 OCI runtime create failed 只读文件系统
Docker挂载/app/node_modules提示只读文件系统的排查方案
根因说明
该报错发生在容器启动的runc挂载阶段,和用户是否加入docker组无关,本质是挂载目标路径的访问权限被限制为只读,常见诱因包括compose配置错误、磁盘分区挂载状态异常、Docker数据目录权限异常、残留卷损坏四类。
分步排查与修复
- 第一步:检查compose文件的挂载参数
打开项目下的docker-compose.yml和docker-compose.dev.yml,定位到backend服务的volumes配置段,找到/app/node_modules对应的挂载项。如果项末尾带有:ro后缀,就是显式配置了只读挂载,容器内进程无法向该路径写入数据,直接删除:ro即可(卷默认挂载模式为读写:rw,不需要额外标注参数)。错误配置示例:
volumes: - ./backend-code:/app - backend_node_modules:/app/node_modules:ro修正后配置:
volumes: - ./backend-code:/app - backend_node_modules:/app/node_modules - 第二步:检查项目所在分区的挂载状态
全新Ubuntu如果开启了全盘加密、项目放在NTFS格式外接盘、或者系统异常触发磁盘保护,会自动把分区挂载为只读模式。在项目根目录打开终端执行:
如果输出结果中包含mount | grep "$(df -P . | awk 'NR==2{print $1}')"ro标记,说明分区为只读状态,执行sudo mount -o remount,rw $(df -P . | awk 'NR==2{print $1}')将分区重新挂载为读写模式即可。如果项目存放在NTFS格式的外接存储上,需要先执行sudo apt install ntfs-3g安装NTFS读写驱动,再执行重挂载操作。 - 第三步:检查Docker数据目录状态
Docker默认的卷、镜像数据都存储在/var/lib/docker路径下,先执行findmnt /var/lib/docker查看该目录所在分区是否带ro只读标记,如果存在只读标记参考第二步的重挂载命令修复。再执行ls -ld /var/lib/docker确认目录权限为drwx--x---、属主属组为root,如果权限不对执行:
修复权限后重启Docker服务:sudo chown root:root /var/lib/docker sudo chmod 710 /var/lib/dockersudo systemctl restart docker - 第四步:清理异常残留卷
之前启动失败残留的损坏匿名卷也会触发挂载错误,在项目根目录执行docker compose down -v,删除当前项目关联的所有停止容器、网络和挂载卷(注意:该操作会清空项目关联卷内的所有数据,比如数据库测试数据,有需要提前备份),再重新执行原启动命令构建启动即可。
有效性验证
容器启动后执行docker compose exec backend sh进入backend容器命令行,在容器内执行touch /app/node_modules/testwrite,如果没有报错说明挂载权限正常,删除测试文件rm /app/node_modules/testwrite即可退出容器。
内容的提问来源于stack exchange,提问作者plutownium
相关产品推荐
相关产品推荐

