这篇文章介绍一下MySQL镜像启动时候通过command方式动态修改参数的方法,并以MySQL镜像缺省字符集修改的实际问题对应作为示例进行使用说明。
应用场景:
MySQL或者Mariadb官方镜像缺省的字符集为latin1,在前面的文章中介绍了对于全局/数据库/表/字段的字符集的查看/设定/修改的多种方式,但是大多方式都是在容器启动之后,或者是需要修改my.cnf的配置文件,从而可能需要修改镜像,把镜像的配置卷挂出来,然后修改设定文件,这些都需要一些额外的手动操作。
有关MySQL字符集查看和设定的内容可参看:
事前环境
可参看Easypack的Redmine的docker-compose.yml文件确认缺省状态下的MySQL数据库的字符集设定。文件内容如下所示:
version: '2'
services:
redmine:
image: liumiaocn/redmine
ports:
- 3000:3000
environment:
REDMINE_DB_MYSQL: redmine
REDMINE_DB_PASSWORD: secret
depends_on:
- redminedb
restart: never
redminedb:
image: liumiaocn/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: redmine
restart: never
- 字符集确认
进入到启动的MySQL容器中,可以看到相关设定均为latin1
链接地址:
https://github.com/liumiaocn/easypack/blob/master/containers/alpine/redmine/docker-compose.yml
启动命令:docker-compose up -d
liumiaocn:redmine liumiao$ docker exec -it redmine_redminedb_1 sh
# mysql -uroot -psecret
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 8.0.0-dmr MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show variables like '%character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
mysql>
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
设定方法
通过command可以传入相关参数,这里以设定上述latin1相关的选项为utf8为例进行说明,这里使用这样的一个docker-compose的设定文件
liumiaocn:redmine liumiao$ cat docker-compose.utf8.yml
version: '2'
services:
redmine:
image: liumiaocn/redmine
ports:
- 3000:3000
environment:
REDMINE_DB_MYSQL: redminedb
REDMINE_DB_PASSWORD: secret
depends_on:
- redminedb
restart: "no"
redminedb:
image: liumiaocn/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: redmine
command: ['mysqld','--character_set_server=utf8']
restart: "no"
liumiaocn:redmine liumiao$
- 22
- 23
- 24
启动命令:docker-compose -f docker-compose.utf8.yml up -d
结果确认
liumiaocn:redmine liumiao$ docker exec -it redmine_redminedb_1 sh
# mysql -uroot -psecret
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 8.0.0-dmr MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show variables like '%character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
mysql>
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
Redmine镜像方式启动服务经常碰到的中文问题之一就是由于所使用的数据库创建的时候未指定utf8所导致,此处将MySQL的缺省设定设定未utf8,则可以达到曲线对应的目的。
mysql> show create database redmine;
+----------+------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------+
| redmine | CREATE DATABASE `redmine` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9