• 日期: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 创建文件失败。

排查过程

  1. 确认容器运行中:docker pstypecho Up)。
  2. 容器内查看挂载目录权限:

    docker exec typecho ls -ld /app/usr
    # drwxr-xr-x 6 root root ... /app/usr
  3. 容器内确认 PHP 运行用户为 www-data(uid=33)。
  4. 比对子目录:pluginsthemesuploads 均为 www-data:www-data,只有顶层 /app/usr 是 root,属主不一致。
  5. 查看 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,数据库不落在该目录,不涉及此权限问题,但需额外提供数据库服务。

标签: 故障排查, SQLite, Docker, 文件权限, Typecho

添加新评论