运行MariaDB的Docker Compose脚本时遇批量读取初始化错误求助
MariaDB容器初始化脚本挂载报错排查
问题场景
使用Docker Compose部署MariaDB 10.8.3时,尝试将本地文件/opt/airflow/dags/scripts/mysql_init.sql挂载到容器内/docker-entrypoint-initdb.d/create_schema.sql,期望容器启动时自动执行初始化脚本,但出现以下错误:
/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/create_schema.sql
ERROR: Can't initialize batch readline - may be the input source is a directory or a block device
错误原因
这个报错的核心是容器内的/docker-entrypoint-initdb.d/create_schema.sql并非预期的文件,而是被识别为目录或块设备,导致初始化脚本执行逻辑无法读取正确的SQL文件。大概率是Docker Compose的挂载配置语法错误,误将文件挂载配置成了目录挂载。
解决方法
1. 修正Docker Compose挂载语法
确保挂载规则是本地文件路径:容器内文件路径,两边都要明确指定文件名,不能只写容器内的目录路径:
- 错误配置(会导致容器内
/docker-entrypoint-initdb.d/create_schema.sql变成目录):services: mariadb: image: mariadb:10.8.3 volumes: # 错误:只指定了容器内目录,本地文件会被当成目录挂载 - /opt/airflow/dags/scripts/mysql_init.sql:/docker-entrypoint-initdb.d/ - 正确配置:
services: mariadb: image: mariadb:10.8.3 volumes: # 正确:明确指定本地文件和容器内目标文件的对应关系 - /opt/airflow/dags/scripts/mysql_init.sql:/docker-entrypoint-initdb.d/create_schema.sql
2. 验证本地文件状态
- 确认本地
/opt/airflow/dags/scripts/mysql_init.sql是真实存在的文件,而非目录:ls -l /opt/airflow/dags/scripts/mysql_init.sql - 给文件设置合理权限,确保容器进程能读取:
chmod 644 /opt/airflow/dags/scripts/mysql_init.sql
3. 清理旧容器与数据卷(若已初始化过容器)
如果之前已经启动过容器,MariaDB会标记数据目录为已初始化,不会再执行/docker-entrypoint-initdb.d下的脚本,需要清理后重新启动:
# 停止并删除容器 docker-compose down # 同时删除关联的数据卷(会清除已有数据,谨慎操作) docker-compose down -v # 重新启动容器 docker-compose up -d
内容的提问来源于stack exchange,提问作者Ankit Chakraborty
相关产品推荐
相关产品推荐

