美文网首页程序员码农的世界开发经验随笔
配置错误导致容器无法启动的修复方案

配置错误导致容器无法启动的修复方案

作者: 山东大葱哥 | 来源:发表于2019-08-09 00:56 被阅读13次

    你有没有遇到过一个在正常使用的容器,因为修改某个配置文件,结果导致容器启动失败的情况?
    一般碰到这种情况,你在网上找到的资料都是说让你重新创建容器,但重新创建容器可能会使你丢失一些数据或者做很多重复工作,那么有没有办法在容器无法启动的情况下进行修复呢?
    我今天就遇到了这种情况,并成功找到了一个解决办法,供大家参考。

    背景描述

    我使用镜像 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

    相关文章

      网友评论

        本文标题:配置错误导致容器无法启动的修复方案

        本文链接:https://www.haomeiwen.com/subject/tyxfjctx.html