Docker Compose中MySQL不读取自定义conf、无法加载大SQL及开放外部连接问题
问题修复方案
核心错误原因
- 重复command覆盖:docker-compose中同一服务下多次写
command字段,只有最后一条会生效,前面的权限修改命令完全未执行;且mysql官方镜像默认无sudo命令,就算执行也会报错 - my.cnf未生效:由于你挂载的z_my.cnf权限不符合mysql要求(mysql要求配置文件不能被其他用户可写),导致配置未加载,你设置的
max_allowed_packet=1G未生效,触发大SQL的查询大小限制报错 - 初始化逻辑错误:使用
--init-file导入大SQL的限制远高于官方镜像自带的/docker-entrypoint-initdb.d/自动导入逻辑;同时自定义command覆盖了官方入口脚本的初始化流程,MYSQL_ROOT_HOST: '%'的配置完全未生效,导致root用户默认只允许本地登录,出现外部主机连接被拒绝的报错 - 残留数据影响:第一次启动失败后生成的
dbdata目录残留了未完成初始化的mysql数据,后续即使修改配置重启,也不会重新执行初始化逻辑,配置不会生效
修复步骤
- 先清理旧的残留数据,避免影响重新初始化:
docker-compose down -v
- 修正宿主机上my.cnf的权限,确保mysql可以正常加载:
chmod 644 ./db/my.cnf
- 替换docker-compose.yml为如下内容:
version: '3.2' services: db: image: mysql:8.0 container_name: acDB restart: always ports: - '6603:3306' environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: ac_db MYSQL_USER: ac MYSQL_PASSWORD: ac MYSQL_ROOT_HOST: '%' volumes: - ./db/my.cnf:/etc/mysql/conf.d/z_my.cnf - ./dbdata:/var/lib/mysql # 挂载到官方镜像的自动初始化目录,首次启动会自动执行该目录下的sql文件 - ./db/big.sql:/docker-entrypoint-initdb.d/init.sql phpmyadmin: depends_on: - db image: phpmyadmin/phpmyadmin container_name: phpmyadmin restart: always ports: - '8080:80' environment: PMA_HOST: db PMA_USER: root PMA_PASSWORD: root volumes: dbdata:
- 重新启动服务:
docker-compose up -d
验证方式
大SQL导入耗时较长,可以执行docker logs -f acDB查看导入进度,导入完成后:
- 宿主机执行
mysql -h 127.0.0.1 -P 6603 -u root -proot可正常登录 - 访问
http://宿主机IP:8080可正常打开phpmyadmin并登录
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

