Docker无法读取PhpStorm编辑的挂载文件,疑因PhpStorm设置导致
我之前也碰到过几乎一模一样的问题!结合你说的「用Sublime编辑没问题、偶尔cat能恢复」的现象,大概率是PhpStorm的文件写入机制和Docker挂载的文件系统兼容性冲突导致的,重点检查这几个设置:
关闭「安全写入(Safe Write)」
这是最常见的原因!PhpStorm默认开启的安全写入会先把修改内容写到一个临时文件,再替换掉原文件。但Docker的bind mount挂载方式对这种原子替换操作的处理可能有延迟或异常,导致原文件处于临时不可读的状态(也就是你碰到的Input/output error)。
关闭路径:File > Settings > Appearance & Behavior > System Settings,找到「Use safe write (save changes to a temporary file first)」,取消勾选后重启PhpStorm试试。调整自动保存频率
如果自动保存太频繁,再加上安全写入的机制,会导致文件被反复替换,加重挂载文件系统的同步负担。可以去File > Settings > Appearance & Behavior > System Settings里,要么延长「Save files automatically if application is idle for X seconds」的时间,要么干脆改成手动保存(按Ctrl+S/Cmd+S),减少不必要的文件操作。清理PhpStorm缓存并重启
有时候PhpStorm的本地文件缓存和Docker挂载的实际文件状态不同步,也会导致奇怪的读取问题。执行File > Invalidate Caches...,选择「Invalidate and Restart」,清理缓存后再测试编辑和读取操作。检查换行符格式(可选)
虽然这个概率比较低,但如果你的PhpStorm默认用Windows换行符(CRLF),而Docker容器是Linux环境(默认LF),极端情况下可能导致文件读取异常。可以去File > Settings > Editor > Code Style > General,把「Line separator」改成「Unix and macOS (\n)」,确保和容器环境一致。
按上面的步骤调整后,编辑composer.json并保存,立刻在容器里执行cat composer.json,应该就能正常读取了。如果还是有问题,可以再检查下Docker的挂载命令是不是用了:ro这类只读参数(不过你能编辑的话应该不是),或者试试把挂载方式改成Docker Volume(而非bind mount),但根据你的描述,核心问题还是在PhpStorm的设置上。
内容的提问来源于stack exchange,提问作者Anthony

