Docker bind mount 在编辑器保存后失效

dev · 最后更新 2026年9月12日

现象

用 vim 或 VSCode 编辑并保存 bind mount 的源文件,然后重启容器,容器里看到的还是旧内容甚至空文件。但 docker inspect 显示 mount 路径完全正确。

根因

这类编辑器默认的保存策略是写一个新文件再 rename 替换,inode 会变。Docker 的 bind mount 绑定的是创建容器时的 inode,文件被替换后容器引用的是已删除的旧 inode。

修复

必须重建容器,仅 restart 无效。

docker compose up -d --force-recreate <service>

排查特征

日志报连默认地址失败,比如 127.0.0.1:3306,说明程序根本没读到 config,走了内置默认值。

规避

挂目录而不是挂单个文件,写成 ./config/:/app/config/:ro 而不是 ./config.yaml:/app/config/config.yaml:ro。或者给 vim 配 set backupcopy=yes,让它原地写入保留 inode。

docker踩坑