蜂巢词元 蜂巢词元 · 蜂巢涌动旗下
EN
首页 / 博客 / Docker 容器内写 SQLite,宿主直连却读不到?WAL 检查点问题

Docker 容器内写 SQLite,宿主直连却读不到?WAL 检查点问题

2026-09-21 · 蜂巢词元

容器里明明有数据,宿主上看不到

应用跑在容器里,数据目录通过 volume 挂到宿主。容器内建表、写入、查询都正常。你在宿主上敲:

sqlite3 /data/app/app.db ".tables"

新表看不见,刚写的行也查不到。

根因:数据还躺在 -wal 文件里

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 再下结论,别急着怀疑同步延迟。

前往控制台体验