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

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脚本,想保持目录挂载的方式,那需要做两件事:

  1. 检查本地./data目录里,绝对不能有同名的dump.sql文件夹,确保只有dump.sql文件存在
  2. 调整本地SQL文件的权限,让MySQL容器能读取它:
    chmod 644 ./data/dump.sql
    
    因为MySQL容器内部是用mysql用户(UID 999)运行的,如果本地文件权限太严格,容器会无法读取。

额外注意事项

  • 只有当MySQL容器第一次启动(对应的数据卷还未创建)时,/docker-entrypoint-initdb.d里的脚本才会执行。如果之前已经启动过容器,旧的数据卷会保留,新的SQL脚本不会生效。这时需要先清理旧数据卷:
    docker-compose down -v
    
    然后再重新启动容器:
    docker-compose up -d
    
  • 提前验证你的dump.sql文件没有语法错误,可以在本地MySQL里先尝试导入一次,避免因为SQL本身的问题导致容器崩溃。

内容的提问来源于stack exchange,提问作者Pieter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:38:55