Docker中MariaDB容器未执行初始化SQL,数据库无表问题排查
数据目录已存在旧数据
MariaDB容器仅在首次初始化(/var/lib/mysql目录为空时)才会执行docker-entrypoint-initdb.d下的脚本。如果./database/mysqldata目录之前已经被使用过(比如之前启动过容器),里面已有数据库文件,备份脚本不会被触发。
解决:停止容器,删除./database/mysqldata目录下的所有内容,再重新启动:sudo docker-compose down rm -rf ./database/mysqldata/* sudo docker-compose up -d备份文件权限不足
容器内的MySQL进程以mysql用户运行,若宿主机上的my_dump.sql权限过高(比如仅root可读),容器内进程无法读取该文件,导致脚本不执行。
解决:调整宿主机上备份文件的权限:chmod 644 ./database/my_dump.sql备份文件的数据库名称不匹配
检查my_dump.sql中的目标数据库是否与配置里的MYSQL_DATABASE: my一致。如果备份文件中使用了USE 其他库名;或CREATE DATABASE 其他库名;,数据会被导入到其他数据库,登录my库自然看不到表。
解决:打开备份文件,确认开头是否有USE my;语句,若没有则添加,或者修改备份文件中的库名与配置一致。备份文件执行报错
查看容器启动日志,确认备份脚本执行过程中是否有错误:docker logs my_db日志中会显示初始化脚本的执行情况,比如语法错误、数据格式问题等,根据报错信息修复备份文件。
启动命令存在问题
你使用的docker-compose build | docker-compose up用了管道符,这会将build的输出作为up的输入,可能导致启动异常。正确的命令应该是:sudo docker-compose build && sudo docker-compose up
内容的提问来源于stack exchange,提问作者matteo camillo

