## [ERR-20260415-001] Write 工具破坏 Docker bind-mount 的单文件绑定

**日期**: 2026-04-15
**类别**: Docker / 工具链
**严重度**: 中（配置看似更新成功但容器内无变化，难以察觉）

### 问题描述
需要更新 Caddy 的 Caddyfile（bind-mount 到 `/etc/caddy/Caddyfile`），通过 Write 工具覆盖 `/home/chentao/caddy-config/Caddyfile` 后执行 `docker exec caddy caddy reload`，日志返回 `config is unchanged`，容器内 `cat /etc/caddy/Caddyfile` 仍是旧内容。

### 根本原因
Docker 单文件 bind-mount（非目录）在创建容器时绑定到当时那一个 **inode**。Write/Edit/tee 等工具如果走 "写临时文件 + rename 覆盖" 的路径，结果是新文件 = 新 inode，旧 inode 仍被容器持有，宿主机看到的是新文件，容器里看到的是旧文件。

验证方式：
```
stat -c '%i' /home/chentao/caddy-config/Caddyfile           # 宿主机 inode
docker exec caddy stat -c '%i' /etc/caddy/Caddyfile         # 容器 inode
```
两者不同即确认 inode 漂移。

### 解决方案
三选一：
1. **重启容器**：`docker restart caddy`，容器会按当前路径重新绑定新 inode（最快）。
2. **改为目录绑定**：把整个 `caddy-config/` 目录挂到 `/etc/caddy/`，目录内文件替换不影响绑定。
3. **容器内直接改**：`docker exec caddy sh -c 'cat > /etc/caddy/Caddyfile' < new.file`，保留原 inode。

推荐默认用方案 1，工具无关最稳。

### 预防措施
- 单文件 bind-mount 改完后，**务必 `docker exec <ctr> cat <path>` 验证**一次，不能只相信宿主机文件。
- 长期应把单文件 bind-mount 改为目录 bind-mount。

### Metadata
- Reproducible: yes（任何单文件 bind-mount + 以 Write/sed -i /tee 替换宿主机文件的场景）
- Related Files: /home/chentao/caddy-config/Caddyfile, docker container `caddy`

---
