Docker容器未在MySQL中创建数据库表问题求助
问题:Docker部署MySQL容器后schema.sql未创建表
背景
我尝试用Docker容器化部署数据库,原本在Workbench中使用该数据库,导出了schema.sql脚本。
schema.sql内容
DROP TABLE IF EXISTS `track`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `track` ( `id` int NOT NULL AUTO_INCREMENT, `isrc` varchar(20) NOT NULL, `name` varchar(100) NOT NULL, `duration_ms` int NOT NULL, `explicit` tinyint(1) NOT NULL, `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `artists` text, PRIMARY KEY (`id`), UNIQUE KEY `isrc` (`isrc`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Table structure for table `user` -- DROP TABLE IF EXISTS `user`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `user` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `email` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `enabled` tinyint(1) NOT NULL, `secret` varchar(255) DEFAULT NULL, `verification_code` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
docker-compose.yml配置
version: '3.8' services: db: image: mysql:latest environment: MYSQL_DATABASE: newdb MYSQL_ROOT_PASSWORD: password ports: - "3307:3306" volumes: - ./mysqldata:/var/lib/mysql - ./src/main/resources/schema.sql:/docker-entrypoint-initdb.d/
路径确认与应用配置
schema.sql的实际路径是/RestAPI-MetaData/src/main/resources/schema.sql,应用的application.properties配置如下:
spring.datasource.url=jdbc:mysql://localhost:3307/newdb spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
问题现象
执行docker-compose up -d后容器正常运行,应用也能连接数据库,但进入容器内的MySQL后发现,newdb数据库存在,但没有任何表:
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | newdb | | performance_schema | | sys | +--------------------+ 5 rows in set (0.02 sec) mysql> use newdb Database changed mysql> show tables -> ; Empty set (0.00 sec)
解决方法
1. 验证挂载路径是否正确
Docker Compose中使用的是相对路径./src/main/resources/schema.sql,需确认docker-compose.yml所在目录是否与src目录同级。若路径错误,会导致脚本无法挂载到容器内的/docker-entrypoint-initdb.d/目录。
执行以下命令检查容器内的初始化目录:
docker exec -it <容器ID或名称> ls /docker-entrypoint-initdb.d/
若输出中没有schema.sql,需调整volumes配置为正确的相对路径或绝对路径。
2. 重置数据目录重新执行初始化脚本
MySQL镜像仅在首次启动且数据目录为空时执行/docker-entrypoint-initdb.d/下的脚本。若之前启动过容器,本地./mysqldata目录已有数据,脚本不会重复执行。
操作步骤:
# 停止并删除容器 docker-compose down # 删除本地数据目录 rm -rf ./mysqldata # 重新启动容器 docker-compose up -d
3. 检查脚本执行日志
查看MySQL容器日志,确认脚本是否存在执行错误:
docker logs <容器ID或名称>
若日志中出现SQL语法错误,需修正schema.sql中的问题,比如调整注释格式、字符集配置以适配当前MySQL版本。
4. 确保脚本文件权限正确
若容器无法读取schema.sql,也会导致脚本不执行。可调整本地文件权限:
chmod 644 ./src/main/resources/schema.sql
内容的提问来源于stack exchange,提问作者Brendan Ahern
相关产品推荐
相关产品推荐

