你有没有遇到过一个在正常使用的容器,因为修改某个配置文件,结果导致容器启动失败的情况?
一般碰到这种情况,你在网上找到的资料都是说让你重新创建容器,但重新创建容器可能会使你丢失一些数据或者做很多重复工作,那么有没有办法在容器无法启动的情况下进行修复呢?
我今天就遇到了这种情况,并成功找到了一个解决办法,供大家参考。
背景描述
我使用镜像 centos/mysql-57-centos7 创建的容器(偷懒没有做挂载目录),主要用来运行mysql数据库,所以这个容器里如果mysqld启动异常的话,容器就挂掉了,而我碰到的就是这个情况。
创建过程如下:
docker run -d --name pinyougou -e MYSQL_ROOT_PASSWORD=123456 -p 33306:3306 -p 33307:22 centos/mysql-57-centos7
悲剧发生的过程
我在这个数据库中已经初始化了很多数据。
现在需要修改my.cnf参数开启binlog,结果修改后造成了mysql启动失败,容器也无法启动。
docker exec -it --user root pinyougou bash
在容器内执行命令
cd /var/lib/mysql/
mkdir logs
vi /etc/my.cnf
在配置文件中增加一行
log-bin=/var/lib/mysql/logs/mysql-bin.log
保存并退出,然后重新启动容器
docker restart pinyougou
然后悲剧就发生了,容器启动不了了,查看日志发现
image.png
重点就是:
You have enabled the binary log, but you haven't provided the mandatory server-id. Please refer to the proper server start-up parameters documentation
解决方案
求助百度
结果发现大部分都是让你重新安装容器,因为我的容器有一些重要数据,不能采用该方案。
还有一个相对来说有用的信息,说可以在宿主机中找到docker容器的磁盘文件,我找了但没有找到我这个容器的对应信息,可能是docker版本的原因吧,这个方案也不适合我。
看官方资料
把官方docker相关的命令都过了一遍,发现有用的命令都需要容器运行状态才能用。
在山穷水尽之时发现了一个命令docker cp
,仔细看了官方说明,觉得有戏,这个命令支持双向拷贝文件,可以在宿主机向容器拷贝,也可以在容器向宿主机拷贝,那么我只需要把mysql配置文件的错误修复过来就可以了。
解决
终于找到了解决方案
于是动手操作,先把容器里面的错误配置文件复制出来,修改后再复制回去就可以了
docker cp pinyougou:/etc/my.cnf my.cnf
在宿主机打开却发现文件是空的内容,这不合情理啊,我明明改过内容的,回来经过对比确认centos/mysql-57-centos7 容器里面使用了软链接方式,这样复制出来的只是一个断掉的软链接,
需要复制软链接对应的真实文件。
docker cp pinyougou:/etc/opt/rh/rh-mysql57/my.cnf my.cnf
把错误修复后,再复制后去就可以愉快的玩耍了。
docker cp my.cnf pinyougou:/etc/opt/rh/rh-mysql57/my.cnf
docker start pinyougou
image.png
网友评论