Docker Compose挂载SQL文件到MySQL容器失败求助
解决Docker Compose挂载SQL备份文件到MySQL容器时的文件夹替代问题
我之前也碰到过一模一样的问题!核心原因是Docker的挂载规则在搞鬼:当你把本地的./data目录挂载到容器的/docker-entrypoint-initdb.d时,Docker会直接用本地目录覆盖容器里的对应目录,而不是把目录里的文件复制进去。这就导致容器启动时,尝试执行dump.sql这个目录而不是SQL文件,直接触发了你看到的Can't initialize batch_readline错误,看起来就像是容器里创建了同名文件夹。
这里有两种靠谱的解决方案,你可以根据需求选:
方案一:直接挂载单个SQL文件(推荐)
修改docker-compose.yml里的db服务volumes配置,把整个目录挂载改成单个文件挂载:
version: '2' services: db: image: mysql:latest volumes: # 直接指定挂载单个SQL文件到容器的初始化目录 - ./data/dump.sql:/docker-entrypoint-initdb.d/dump.sql environment: MYSQL_ROOT_PASSWORD: wordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_PASSWORD: wordpress volumes: - ./wp-content/themes/portalV3:/var/www/html/wp-content/themes/portalV3 - ./wp-content/plugins:/var/www/html/wp-content/plugins - ./wp-content/uploads:/var/www/html/wp-content/uploads
这样Docker会明确把本地的dump.sql文件映射到容器的/docker-entrypoint-initdb.d目录下,容器启动时就能正确识别并执行这个SQL脚本了。
方案二:保持目录挂载(适合多初始化脚本场景)
如果你以后可能需要添加更多初始化SQL脚本,想保持目录挂载的方式,那需要做两件事:
- 检查本地
./data目录里,绝对不能有同名的dump.sql文件夹,确保只有dump.sql文件存在 - 调整本地SQL文件的权限,让MySQL容器能读取它:
因为MySQL容器内部是用chmod 644 ./data/dump.sqlmysql用户(UID 999)运行的,如果本地文件权限太严格,容器会无法读取。
额外注意事项
- 只有当MySQL容器第一次启动(对应的数据卷还未创建)时,
/docker-entrypoint-initdb.d里的脚本才会执行。如果之前已经启动过容器,旧的数据卷会保留,新的SQL脚本不会生效。这时需要先清理旧数据卷:
然后再重新启动容器:docker-compose down -vdocker-compose up -d - 提前验证你的
dump.sql文件没有语法错误,可以在本地MySQL里先尝试导入一次,避免因为SQL本身的问题导致容器崩溃。
内容的提问来源于stack exchange,提问作者Pieter
相关产品推荐
相关产品推荐

