MySQL8 Docker Compose密码失效及dump初始化文件执行报错排查
问题根源排查
- Dockerfile未生效:你编写了自定义Dockerfile处理初始化SQL,但docker-compose.yml中直接指定
image: mysql:8.0.21,没有使用本地构建的镜像,Dockerfile中配置的环境变量、复制的SQL文件全部没有生效,是密码配置被忽略的核心原因。 --init-file参数用法错误:MySQL的--init-file启动参数要求指定单个SQL文件路径,你传入的是/docker-entrypoint-initdb.d/目录,直接触发I/O error 1的启动报错,是数据库启动异常、初始化失败的直接原因。- 初始化逻辑冲突+卷残留:官方MySQL镜像默认会在首次启动时自动执行
/docker-entrypoint-initdb.d/下的所有SQL文件,不需要额外加--init-file参数。加上该参数后会和镜像默认初始化逻辑冲突,第一次启动时会中断初始化,导致/var/lib/mysql目录下生成不完整的文件结构,所以会出现需要启动两次、提示数据目录不可用的问题。
修复步骤
1. 修改docker-compose.yml配置
调整配置让compose使用自定义镜像,删除错误的启动参数:
version: "3.8" services: mysqldb: build: ./MySQL # 替换原有image字段,指定Dockerfile所在目录 container_name: mysqlDB # 仅保留认证插件配置,删除错误的init-file参数 command: --default-authentication-plugin=mysql_native_password ports: - "3307:3306" restart: always environment: MYSQL_DATABASE: Olimpo MYSQL_USER: admin MYSQL_PASSWORD: senha MYSQL_ROOT_PASSWORD: senha volumes: - mysql_data:/var/lib/mysql # 如果你不想把SQL内置到镜像里,可以直接挂载本地SQL目录,此时Dockerfile中ADD、sed、cp相关步骤可以全部删除 # - ./MySQL:/docker-entrypoint-initdb.d networks: - backend volumes: mysql_data: driver: local networks: backend:
2. 清理旧残留资源
执行以下命令彻底清理旧容器、镜像、卷:
docker-compose down -v docker system prune -a
3. 重新启动服务
启动时添加--build参数强制构建自定义镜像,确保修改生效:
docker-compose up --build
4. 验证配置有效性
服务启动完成后,执行以下命令测试登录:
docker exec -it mysqlDB mysql -u admin -psenha
登录成功后执行SQL验证初始化结果:
show databases; use Olimpo; show tables;
内容的提问来源于stack exchange,提问作者Raissa Correia
相关产品推荐
相关产品推荐

