安装deb包时操作MySQL并通过脚本完成数据初始化的问题咨询
问题解决方案
- 调整脚本执行阶段
你当前将Doctrine迁移命令放在了DEBIAN/config文件中,而dpkg的config阶段仅用于处理debconf配置交互,此时依赖的mariadb-server还未完成安装、也没有启动,相关数据库操作自然无法执行。之前安装无报错是因为-q参数屏蔽了所有输出,且config阶段执行的数据库操作失败后可能被dpkg的流程吞掉了错误提示。你需要将数据库相关操作转移到DEBIAN/postinst(安装后执行)阶段。 - 提前启动MariaDB服务
在postinst中执行数据库操作前,先添加启动MariaDB的逻辑,同时配置开机自启:# 重载systemd配置 systemctl daemon-reload # 启动MariaDB服务,已启动状态下执行也不会报错 systemctl enable --now mariadb # 等待服务启动完成,避免后续操作连接失败 sleep 2 - 修正dbconfig-common的使用逻辑
你不需要手动编写创建数据库、用户的SQL文件,dbconfig-common会自动完成这些操作,手动写的SQL可能会和dbc的自动逻辑冲突,你只需要在DEBIAN/config中声明相关变量即可:# DEBIAN/config 仅保留以下配置即可 set -e . /usr/share/debconf/confmodule # 如需固定数据库名、账号密码可提前声明以下变量 # dbc_dbname="kaya" # dbc_dbuser="kaya" # dbc_dbpass="你的自定义密码" if [ -f /usr/share/dbconfig-common/dpkg/config.mysql ]; then . /usr/share/dbconfig-common/dpkg/config.mysql dbc_go kaya-rest "$@" fi - 在postinst阶段执行Doctrine迁移
等dbconfig-common完成数据库初始化后,再执行迁移命令,同时要确保Symfony的数据库配置文件已经写入了dbc生成的数据库账号信息:# DEBIAN/postinst 内容示例 #!/bin/sh set -e . /usr/share/debconf/confmodule if [ -f /usr/share/dbconfig-common/dpkg/postinst.mysql ]; then . /usr/share/dbconfig-common/dpkg/postinst.mysql dbc_go kaya-rest "$@" fi # 启动MariaDB systemctl daemon-reload systemctl enable --now mariadb sleep 2 # 写入数据库配置到Symfony的.env文件(根据你的实际路径调整) echo "DATABASE_URL=mysql://$dbc_dbuser:$dbc_dbpass@localhost:3306/$dbc_dbname?serverVersion=mariadb-10.5.0" > /etc/nerd4ever/kaya/back-end/.env.local # 执行迁移 php /etc/nerd4ever/kaya/back-end/bin/console doctrine:migration:migrate --no-interaction - 额外注意事项
要确保你的deb包依赖中已经正确添加了mariadb-server、dbconfig-mysql、php-cli以及Symfony运行需要的PHP扩展,避免执行迁移时缺少依赖。
内容的提问来源于stack exchange,提问作者Sileno Brito
相关产品推荐
相关产品推荐

