你有没有遇到过一个在正常使用的容器, 因为修改某个配置文件, 结果导致容器启动失败的情况?
一般碰到这种情况, 你在网上找到的资料都是说让你重新创建容器, 但重新创建容器可能会使你丢失一些数据或者做很多重复工作, 那么有没有办法在容器无法启动的情况下进行修复呢?
我今天就遇到了这种情况, 并成功找到了一个解决办法, 供大家参考.
背景描述
我使用镜像 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
来源: http://www.jianshu.com/p/a59f42e25eb2