原创

Docker 下更改 MySql 核心配置

背景

在我本地的机器上启动 mysql的 docker 容器,由于默认的 mysql 配置不支持 emoji 表情存储,需要更改编码为utf8mb4

前期

  1. 第一次尝试:使用 sql 进行修改,过程完美。
    -- 修改数据库:
    ALTER DATABASE `dblog` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
    -- 修改表:
    ALTER TABLE `biz_article` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    -- 修改表字段:
    ALTER TABLE `biz_article` CHANGE `content` content LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '文章内容';
    ALTER TABLE `biz_article` CHANGE `content_md` content_md LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT 'markdown版的文章内容';
    

问题:在我重启了容器后发现我的配置又变回去了。。。

  1. 第二次尝试:既然重启就恢复那我就改配置。

说干就干,先进容器。

docker exec -it mysql-docker bash

找到配置

vi /etc/mysql/mysql.conf.d/mysqld.cnf

对不起没有 vi,而且你也没办法修改镜像中自带的文件。。。

中期

这可怎么办呢?不让改?

那办法只有一个:指定外部文件,是的,神奇的-v

因为在配置容器的时候对 mysql 的数据目录已经映射到了宿主机,那现在即使删了容器问题也不大,再启动的时候mysql数据还是在的。

再思考我试映射指定文件mysqld.cnf,还是整个配置目录呢/etc/mysql/

答:这样就需要我们把所有镜像内的配置文件都在本地保存一份,要是配置文件不全会出现问题,既然这样那就只映射文件。

后期

  1. 移出容器
docker stop mysql-docker

docker rm mysql-docker
  1. 在本地目录添加 mysql 配置文件/mysql-docker/config/mysqld.cnf
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
  1. 重新构建容器
docker run \
--name mysql-docker \
-d --restart always \
-p 3309:3306 \
-e MYSQL_ROOT_PASSWORD=mysql-docker \
-v $PWD/data/mysql_data:/var/lib/mysql \
-v $PWD/config/mysql_config/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
mysql:5.7

复盘

对于整个 MySQL 的配置其实在容器启动时就应该映射本地文件,怪自己太年轻,只想到映射数据目录,忘却了配置目录。

sev7e0
Write by sev7e0
end
本文目录