Typecho 安装向导报错:unable to open database file
- 日期:2026-08-29
- 项目:typecho(部署目录:codex-docker/typecho)
- 涉及组件:joyqi/typecho:nightly-php8.2-apache 容器(Apache + PHP 8.2,www-data 运行)
- 状态:已修复
现象
访问 http://localhost:5231/install.php 选择 SQLite 数据库安装时,提示:
对不起, 无法连接数据库, 请先检查数据库配置再继续进行安装: "Unable to open database: unable to open database file"根因
SQLite 数据库文件建在 /app/usr/<随机名>.db(对应宿主机 ./typecho-data 挂载目录,见 install.php 默认值 __TYPECHO_ROOT_DIR__ . '/usr/' . uniqid() . '.db')。但宿主机 typecho-data 目录属主为 root:root、权限 755,而容器内 PHP 以 www-data(UID 33)运行,没有该目录的写权限,PDO SQLite 创建文件失败。
排查过程
- 确认容器运行中:
docker ps(typecho Up)。 容器内查看挂载目录权限:
docker exec typecho ls -ld /app/usr # drwxr-xr-x 6 root root ... /app/usr- 容器内确认 PHP 运行用户为 www-data(uid=33)。
- 比对子目录:
plugins、themes、uploads均为www-data:www-data,只有顶层/app/usr是 root,属主不一致。 - 查看 install.php(
grep -n "dbFile\|uniqid" /app/install.php)确认 SQLite 默认路径为/app/usr/<uniqid>.db。
结论:www-data 无法在 /app/usr 创建数据库文件,报 unable to open database file。
修复
宿主机上把挂载目录属主改为 www-data(UID 33),与子目录保持一致:
sudo chown 33:33 typecho-data验证(容器内以 www-data 身份写入测试):
docker exec typecho sh -c 'su www-data -s /bin/sh -c "touch /app/usr/.write-test && rm /app/usr/.write-test"'注意事项
- 修复后刷新
/install.php重新提交即可完成安装,数据库文件路径保持默认即可。 - Docker bind mount 会继承宿主机目录的属主/权限,之后若新增挂载目录,记得让容器运行用户(www-data)对其有写权限。
- 若改用 MySQL/MariaDB,数据库不落在该目录,不涉及此权限问题,但需额外提供数据库服务。