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。