You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:42:31