Docker commit生成的MySQL镜像启动失败:数据目录不可用问题咨询
你提供的两种处理方案均不可取:
- 在容器内指定新的数据文件夹会导致删除容器时数据同步丢失,违背备份的核心目的
- 删除宿主机
/var/lib/mysql路径下的内容会直接清空宿主机原生运行的MySQL实例的全部数据,风险极高
问题根因
- 启动命令语法错误:你执行的备份镜像启动命令中同时指定了
mysql:8.0.26和backup-mysql8两个镜像,还重复添加了-d参数,实际运行的是官方mysql:8.0.26镜像,而非你自行提交的备份镜像。 - 目录挂载异常:本次启动的官方MySQL镜像意外挂载了宿主机已被其他进程占用的
/var/lib/mysql目录,MySQL进程无法正常读写冲突的目录,触发启动失败报错。 - 备份方式本身存在缺陷:
docker commit默认不会提交容器volume内的数据,而MySQL镜像的/var/lib/mysql默认属于volume路径,哪怕启动命令正确,你提交的镜像也大概率不包含之前写入的业务数据。
修复步骤
- 先清理当前启动失败的异常容器:
docker rm -f 13b17d3af8f7
- 修正启动命令,仅指定你生成的备份镜像,不挂载宿主机的MySQL数据目录:
docker run -p 33069:3306 --name some-mysql -e MYSQL_ROOT_PASSWORD=test -d backup-mysql8 mysqld --default-authentication-plugin=mysql_native_password
后续优化建议
不建议使用docker commit备份MySQL类的有状态服务,推荐两种更稳定的备份方案:
- 执行
docker exec 容器名 mysqldump -u root -p密码 数据库名 > 备份.sql导出SQL文件备份 - 启动容器时显式挂载宿主机的独立目录到容器
/var/lib/mysql路径,直接备份宿主机目录即可,数据不会随容器删除丢失
内容的提问来源于stack exchange,提问作者Buffalo
相关产品推荐
相关产品推荐

