应用跑在容器里,数据目录通过 volume 挂到宿主。容器内建表、写入、查询都正常。你在宿主上敲:
sqlite3 /data/app/app.db ".tables"
新表看不见,刚写的行也查不到。
SQLite 开启 WAL(Write-Ahead Logging)后,写入先追加到 app.db-wal 文件,主库文件并不会立刻更新。容器内的连接能读到完整数据,是因为它同时读了主库和 WAL;而宿主上新开的连接虽然理论上也能读 WAL,但跨容器、跨进程场景下常因共享内存文件(-shm)状态不一致,读到的是旧快照。
在宿主上把 WAL 合并回主库,即可看到最新数据:
sqlite3 /data/app/app.db "PRAGMA wal_checkpoint(TRUNCATE);"
TRUNCATE 会在合并后把 WAL 文件截断为 0,比默认的 PASSIVE 干净,排查时用这个。
我在宿主侧直接建过表(加张表但不想重启容器),建完也得执行一次检查点,否则容器里的连接看不到这张新表。
sqlite3 "file:/data/app/app.db?mode=ro" "SELECT count(*) FROM logs;"
避免误写,也少点锁竞争。跨容器看数据对不上,先 checkpoint 再下结论,别急着怀疑同步延迟。