问题描述

MySQL5.7开始默认启用only_full_group_by选项,于是我在配置文件(/etc/mysql/mysql.conf.d/mysqld.cnf)中加了

SET sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

修改了docker容器中的配置信息,由于配置文件写错,或者配置文件格式错误等原因,导致容器无法再次启动

方法一

docker容器的一些配置信息一般在var/lib/docker/overlay下面,我们到此目录找到对应的配置,修改后即可重新启动

1. 查询日志
docker logs 容器名/容器id
ERROR: mysqld failed while attempting to check config
command was: "mysqld --verbose --help"

2019-08-20T12:20:57.919628Z 0 [ERROR] unknown variable 'SET sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
2019-08-20T12:20:57.923248Z 0 [ERROR] Aborting

ERROR: mysqld failed while attempting to check config
command was: "mysqld --verbose --help"

2019-08-20T12:21:58.445399Z 0 [ERROR] unknown variable 'SET sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
2019-08-20T12:21:58.448990Z 0 [ERROR] Aborting

由错误可知我在配置文件配置了错误的参数 SET sql_mode=...
该参数是我配置在mysql容器配置文件 mysqld.cnf中的,所以我们要找到该配置文件,然后将 SET sql_mode=... 删除

2. 查找文件
mandy@ubuntu:~$ sudo find / -name mysqld.cnf
/tmp/mysqld.cnf
/var/lib/docker/overlay2/967bef783b7ae60e477382ac25f015793f8e3047f7bbca203759ed1ab1b2a661/diff/etc/mysql/mysql.conf.d/mysqld.cnf
/var/lib/docker/overlay2/ddef71f08d9dc90ceb354850a89e59817c5e730b8fdea07f0916eb95e2637dce/diff/etc/mysql/mysql.conf.d/mysqld.cnf
/var/lib/docker/overlay2/ddef71f08d9dc90ceb354850a89e59817c5e730b8fdea07f0916eb95e2637dce/merged/etc/mysql/mysql.conf.d/mysqld.cnf

备注:你可能会找到多个配置文件,比如你启动了多个mysql容器就会出现多个mysqld.cnf,找到对应你当前错误的mysqld.cnf然后修改重启。

3. 修改配置文件,重启

方法二

把docker容器中的配置文件复制到主机中,然后再主机中修改,修改完成后再复制到docker容器中

1. 复制docker容器的文件到主机中
docker cp 容器id:docker容器中配置文件路径  主机路径
docker cp 2f9845c5e47810a984c5e2ae5a5e5c1e041a746079682e6b464089ca1b1c5fc2:/etc/mysql/mysql.conf.d/mysqld.cnf /tmp/mysqld.cnf  
2. 修改配置文件中出错的部分
3. 配置文件到docker容器中
docker cp 主机文件路径 容器id:docker容器中配置文件路径
docker cp /tmp/mysqld.cnf 2f9845c5e47810a984c5e2ae5a5e5c1e041a746079682e6b464089ca1b1c5fc2:/etc/mysql/mysql.conf.d/mysqld.cnf
4. 重启容器

总结

两种方法均可以解决容器在无法启动的情况下,修改容器中的配置文件。个人比较推荐使用第二种方法,主要知道是哪个配置文件即可复制到主机中,自由修改。

参考:

  1. 至于 only_full_group_by 问题可参考此
  2. Docker修改无法启动的容器的配置文件